彻底迷茫了。我很沮丧,因为我认为准确了解范围和链接如何工作很重要,但我一直看到有关的相互矛盾的信息extern我的编译器/链接器与我读到的内容相矛盾。
----------main.c--------------
int int1;
void main()
{ int1=6;
printf("\nMain - int1 = %4d", int1);
blippy();
printf("\nMain - int1 = %4d", int1);
return;
}
-------------第二个.c-------------
int int1;
void blippy()
{ printf("\nSecond - int1 = %4d", int1);
int1++;
return ;
}
输出是:
Main - int1 = 6
Second - int1 = 6
Main - int1 = 7
就好像 int1 的两个实例都指向一个具有外部链接的变量。我希望编译器要么抛出多重定义错误,要么将它们视为静态。我正在使用 Codeblocks,但我不知道它是否在幕后做任何自以为是的事情。
很大程度上是由于历史原因,int int1;
既不是简单的声明,也不是简单的定义。它是一个暂定定义。如果没有正则定义int1
在翻译单元(正在编译的源文件,包括其包含的所有文件)中,并且整个程序中只有一个定义,则暂定定义将充当常规定义。
但是,如果您在多个翻译单元中对同一标识符有暂定定义(没有常规定义),则该行为不是由 C 标准定义的。一些编译器(包括最近的 GCC)允许多个暂定定义,并允许链接器将它们合并为一个定义。从版本 10 开始,GCC 不再这样做,并允许链接器将它们视为多个定义,除非开关另有要求,-fcommon
.
你(们)能做到int int1;
通过提供初始值设定项进入常规定义,int int1 = 0;
.
一些附加信息是here https://stackoverflow.com/questions/64841554/does-variables-declared-in-a-header-file-give-separate-copies-of-the-variables-t/64844348#64844348 and here https://stackoverflow.com/questions/66055165/advantage-of-using-extern-in-a-header-file/66056029#66056029.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)