我在一个工程中建立了两个文件:A.c和B.c,在A.c中定了一个变量:int x;在B.c中也定义了一个变量int x;,但均不初始化,发现此时链接的时候不报错,那么请问:这会被当作是同一个变量吗?(也就是说占用同一份内存吗?)

解决方案 »

  1.   

    看你有木有extern喽?有,就是全局的全局(一个变量);木有,就是模块的全局(两个变量),说的怎么这么饶,⊙﹏⊙b汗
      

  2.   

    不相互包含问题不大
    不过最好不要这样
    或者用static限定一下
      

  3.   

    对于全局变量来说,如果不加extern的话,变量的范围不能出这个文件。
      

  4.   

    可是,我试了一个,在AB两个文件中均定义这样的全局变量:int xxx = 0; 结果链接的时候报错,如果不初始化,也就是说在两个文件中均定义:int xxx; 则不报错。既然你说是两个变量,那应该初始化也没有问题才对。可是我始终不能理解。如果不初始化,它们虽然同名,但是是两个变量,互不干涉。可是既然如此,为什么不能初始化呢?还有,如果一个初始化,另一个不初始化,也不会报错。那此时是两个变量还是一个变量呢?
      

  5.   

    可是,我试了一个,在AB两个文件中均定义这样的全局变量:int xxx = 0; 结果链接的时候报错,如果不初始化,也就是说在两个文件中均定义:int xxx; 则不报错
    ===========
    报什么错啊?
      

  6.   

    我在两个文件中均定义了这样的全局变量:int xxx=0;编译链接时,出现这样的错误提示(从编译品复制来的):1>正在链接...
    1>LINK : 没有找到 D:\windows\system32\zywb.ime 或上一个增量链接没有生成它;正在执行完全链接
    1>zywb.obj : error LNK2005: _xxx 已经在 setzg.obj 中定义
    1>   正在创建库 D:\windows\system32\zywb.lib 和对象 D:\windows\system32\zywb.exp
    1>zywb.exp : warning LNK4070: .EXP 中的 /OUT:zywb.dll 指令与输出文件名“D:\windows\system32\zywb.ime”不同;忽略指令
    1>D:\windows\system32\zywb.ime : fatal error LNK1169: 找到一个或多个多重定义的符号
    1>生成日志保存在“file://e:\b\zywb\zywb\Debug\BuildLog.htm”
    1>zywb - 2 个错误,99 个警告
    ========== 全部重新生成: 0 已成功, 1 已失败, 0 已跳过 ==========
      

  7.   

    怎么可能会有干扰呀
    要不然大型程序 几万行代码的人 还不得因为命名问题 头疼死呀。。
    实际上是 不加extern 就无任何关系
      

  8.   

    那就是说:即使不用static限定,两个文件中的同名全局变量也互不干涉,属于不同变量是吗?那为啥在两个文件中只要都进行初始化,就会报错呢?比如两个文件中均定义这样的全局变量:int xxx=0;这样链接的时候会报错。但是如果不初始化好象不报错。
      

  9.   

    int xxx=0;是定义
    int xxx;  是声明
      

  10.   

    我看了,但仍有疑问。主要有两点,第一:《C primer plus》上说:全局变量如果用static 限定,那就是具有内部链接,只在文件内有效。如果不用static限定,那就具有外部链接,对别的文件(当然是同一工程的最终链接到一起的)可见。第二:我实际试验的结果是:如果两文件定义相同名字的全局变量,且均初始化,就会在链接时报错,既然是不同变量,初始化有什么问题呢?(如果不初始化,就没事。)所以,弄得人不知道两个文件中同名全局变量,如果没有初始化,究竟是同一变量还是不同变量。按二楼说法是不同变量。这样我就认为属于不同变量。
      

  11.   

    那么在两个不同的文件中均申明相同名字的变量,比如两文件中均申明:int xxx;那最后在链接时,是两个不同变量呢?还是同一变量?
      

  12.   

    如果没使用xxx则根本就没有变量。
      

  13.   

    我试验了下,在CPP文件中不初不初始化链接时都会出错。
      

  14.   

    按这个试验结果,即使在不同的CPP文件中,变量也是不能同名的。
      

  15.   

    不同编译器的宽容度不一样
    这种问题没什么好纠结的
    养成良好的编程习惯很重要
    尽量不要用同名变量
    如果有非使用不可的场合就加static做限定
    如果你用C++就尽量避免用全局变量
    要学会利用名字空间来避免冲突
      

  16.   

    int xxx=0;是定义
    int xxx; 是声明
    +2楼答案
      

  17.   

    一个变量可以在多个文件中声明,只能定义一次,两次int x;只是声明了一下,并不分配内存空间的。而int x=1;就是定义了,之后不能再其他文件中再次定义。要弄清楚声明与定义的区别