2 trybye TRYBYE 于 2016.04.06 12:53 提问

c语言中我重复定义了为什么编译器没报错了

在头文件和源文件中定义了相同的变量kk,但是编译的时候为什么没报错呢!图片说明

9个回答

CSDNXIAOD
CSDNXIAOD   2016.04.06 13:01

C语言中重复定义的问题
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

u013704336
u013704336   2016.04.06 13:04

哪里显示出你重复定义了?
int kk;//全局变量声明

int main(……)
{
kk = 2;//对kk进行定义
}

TRYBYE
TRYBYE 这不叫重复定义吗??kk定义了2次
2 年多之前 回复
TRYBYE
TRYBYE 这不叫重复定义吗??kk定义了2次
2 年多之前 回复
TRYBYE
TRYBYE 这不叫重复定义吗??kk定义了2次
2 年多之前 回复
u013704336
u013704336 回复TRYBYE: 这样当然不会报错的,main.c中的kk覆盖掉了main.h中的kk
2 年多之前 回复
TRYBYE
TRYBYE 在main.h中
2 年多之前 回复
qq_32223073
qq_32223073   2016.04.06 13:25

你没有重复定义, 一个是全局变量一个是局部变量。

TRYBYE
TRYBYE 刚更新,看一下,
2 年多之前 回复
xuweiwei1860
xuweiwei1860   2016.04.06 13:47

因为有 ifndef 这个控制,会检查重复定义的,如果前面定义了就不会再定义一遍

qq423399099
qq423399099   Ds   Rxr 2016.04.06 14:03

如果不是相互包含,那么问题不大。
如果包含了,不同编译器的宽容度不一样,这种问题没什么好纠结的
像我在VS下,楼主这样的连编译都过不了
全局变量如果用static 限定,那就是具有内部链接,只在文件内有效。如果不用static限定,那就具有外部链接,对别的文件(当然是同一工程的最终链接到一起的)可见。

qq423399099
qq423399099 回复TRYBYE: 不同的编译器看来宽容度差距还挺大
2 年多之前 回复
TRYBYE
TRYBYE 在cfree中头文件和源文件中分别敷了不同的初值,还是可以no woring,no error
2 年多之前 回复
qq423399099
qq423399099 回复TRYBYE: 楼主你试一下给两个kk都附上初值,我想你是过不了编译的
2 年多之前 回复
qq423399099
qq423399099 回复TRYBYE: 确实,感觉GCC在有的方面没有VS严格,有些人的回复我也是醉了。。。。
2 年多之前 回复
TRYBYE
TRYBYE 实际情况不是int kk;会在main.c中出现2次吗?没加static的全局变量应该在所有文件中都可见的啊,vs是不是要求严格一点啊,对新手来讲是vs是不是能更好的养成一些好习惯,谢谢
2 年多之前 回复
TRYBYE
TRYBYE 实际情况不是int kk;会在main.c中出现2次吗?没加static的全局变量应该在所有文件中都可见的啊,vs是不是要求严格一点啊,对新手来讲是vs是不是能更好的养成一些好习惯,谢谢
2 年多之前 回复
u010829724
u010829724   2016.04.06 14:41

这个问题涉及到变量的作用于问题,c语言规定,变量的作用于从变量声明的地方开始,到本文键结束为止。

John_ToStr
John_ToStr   Rxr 2016.04.06 15:34

这跟编译器版本有关, 你的编译器并不支持新的c标准, 建议用vc或者vs

beifengche
beifengche   2016.04.06 22:01

在c语言中可以有多个声明,不会报错。但是要是在C++中会报错

zr1076311296
zr1076311296   2016.04.06 23:41

你把main.h中的 #ifdef 和 #endif去掉估计就会出错了

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言中重复定义的问题
几个基本知识: 1、头文件
C语言中全局变量的定义及重复包含问题
C语言中全局变量的定义及重复包含问题          C语言中一般将全局变量intA的定义和初始化放在fileName .c或者其它 xx.c文件中,同时在与之对应的fileName.h文件中进行 extern int A声明。当一个全局变量int A仅在fileName.c文件中定义而未在相对应的头文件fileName.h声明时,包含与之相应的fileName.h文件时编译器会出现未定义的错
C语言中union的定义问题
在使用C语言定义union的时候遇到一点问题,还没想通,C基础太差。。。 typedef struct {  double      x;//Mag data (mG)  double      y;  double      z; }SOURCE_DATA; typedef union {  double ArrayData[3];  SOURCE_DATA
c语言中同一函数下不可以重复定义变量
main() { int i=0; int a=0; for( int i=0;i<100;i++) { a=a+1; } printf(“%d”,a); } 如上这个程序中,重复定义了两遍int i=0;那么编译器就会报错,报错都是乱报的错误,因为在同一个函数中给同一个变量名重复定义两次,编译器则无法识别,好比两个房子安装了同样的门,那么我们则无法区别这两个房子。
C语言宏定义的几个坑和特殊用法
总结一下C语言中宏的一些特殊用法和几个容易踩的坑。由于本文主要参考GCC文档,某些细节(如宏参数中的空格是否处理之类)在别的编译器可能有细微差别,请参考相应文档。 宏基础 宏仅仅是在C预处理阶段的一种文本替换工具,编译完之后对二进制代码不可见。基本用法如下: 1. 标示符别名 #define BUFFER_SIZE 1024 预处理阶段,foo = (char *) m
关于C语言中定义结构体问题
1、C语言中定义结构体的语法是: struct 结构体名 { 数据成员1; 数据成员2; …… 数据成员n; }; 2、在定义了结构体以后,要想使用该结构体,还需要进行结构体变量的声明,才能在程序中使用该结构体,C语言中定义结构体变量的语法是: (1)struct 结构体名 结构体变量名; 另外也可以在定义结构体的时候,直接在后面声明结构体变量,如下的形式: (
C语言中变量未赋值问题总结
全局,静态变量,一般默认为0;  局部变量在栈上,取决于此处原来的数据,如果不初始化的话;  动态变量在堆上. 正是如此 一般来说 全局变量、静态变量处于数据区,默认初始化为0 (如果指定初始值,则为指定的值) 而局部变量处于堆栈区,其数值是随机的,即当时内存中的值。 总体来说 不要利用编译器的这种默认原则 而是应当显示的指定 必要的初始化不是笨拙 而是规范
R中的Sample函数
今天介绍一些运算函数,它们的使用很简单,没有什么难度,但是也会用的着。 在医学统计学或者流行病学里的现场调查、样本选择经常会提到一个词:随机抽样。随机抽样是为了保证各比较组之间均衡性的一个很重要的方法。那么今天介绍的第一个函数就是用于抽样的函数sample: > x=1:10 > sample(x=x)  [1]  3  5  9  6 10  7  2  1  8  4
C语言中声明和定义详解
变量声明和变量定义 变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。 变量声明:用于向程序表明变量的类型和名字。 定义也是声明,extern声明不是定义 定义也是声明:当定义变量时我们声明了它的类型和名字。 extern声明不是定义:通过使用extern关键字声明变量名而不定义它。 [注意] 变量在使用前就要被定义或者声
防止重复定义的extern技巧的使用
这些文章是 作者看一些优秀的代码的学习笔记。本篇是uc_os中的一些代码。 有不对的地方,欢迎大家拍砖指正。共同进步,O(∩_∩)O~ 防止重复定义的extern技巧的使用 如:自己创建一个工程,全局变量应该是得到内存分配并且可以被其他模块通过C语言中的extern关键字调用的变量。 因此,必须在  .C 和 .H 文件中定义或是通过extern来引入,这种重复的定义很容易