Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 带外部变量和不带外部变量声明之间的差异_C_Linker_Extern - Fatal编程技术网

C 带外部变量和不带外部变量声明之间的差异

C 带外部变量和不带外部变量声明之间的差异,c,linker,extern,C,Linker,Extern,1.h extern int a; 1.c #include <stdio.h> #include "1.h" int main(){ printf("%d\n", a); return 0; } 如果从1.h中删除extern,并打印6,则编译和运行良好(gcc1.c2.c)。 我知道删除它可能会导致在每个翻译单元(对象文件)中定义a,但问题是什么?链接器不是在链接时就把它去掉了吗,因为它编译时没有错误吗?这种技术不符合C标准和 “一个定义规则”-这是官方未定义的行为:

1.h

extern int a;
1.c

#include <stdio.h>
#include "1.h"

int main(){ 
 printf("%d\n", a);
 return 0;
}
如果从
1.h
中删除
extern
,并打印
6
,则编译和运行良好(gcc1.c2.c)。
我知道删除它可能会导致在每个翻译单元(对象文件)中定义
a
,但问题是什么?链接器不是在链接时就把它去掉了吗,因为它编译时没有错误吗?

这种技术不符合C标准和 “一个定义规则”-这是官方未定义的行为:

使用带有外部链接的标识符,但在程序中 标识符的外部定义不存在,或者 未使用该标识符,并且存在多个外部标识符 标识符的定义(6.9)

外部定义是一个外部声明,也是一个 函数的定义(内联定义除外)或 对象 如果在 表达式(不是作为
sizeof的操作数的一部分)或
\u Alignof
运算符,其结果为整数常量),位于 整个程序应有一个完整的外部定义 标识符;否则,不得超过 一(161)

161)因此,如果使用外部链接声明标识符 未在表达式中使用,则不需要外部定义 它

详情如下:

此技术不符合C标准和 “一个定义规则”-这是官方未定义的行为:

使用带有外部链接的标识符,但在程序中 标识符的外部定义不存在,或者 未使用该标识符,并且存在多个外部标识符 标识符的定义(6.9)

外部定义是一个外部声明,也是一个 函数的定义(内联定义除外)或 对象 如果在 表达式(不是作为
sizeof的操作数的一部分)或
\u Alignof
运算符,其结果为整数常量),位于 整个程序应有一个完整的外部定义 标识符;否则,不得超过 一(161)

161)因此,如果使用外部链接声明标识符 未在表达式中使用,则不需要外部定义 它

详情如下:

如果删除
extern
,则
1.c
中的
a
将被取消初始化,
printf
将调用未定义的行为。但在链接过程中是否未链接到正确的值?有关于这个的gcc规则吗?实际上你应该在链接时得到多个定义错误。。。除非我遗漏了什么。不,我没有任何错误。可能没有错误,因为
2.c
已完全优化。但是肯定有一个未定义的行为,因为当我尝试复制它时,它会为我打印
0
。如果删除
extern
,则
1.c
中的
a
将被取消初始化,
printf
将调用未定义的行为。但在链接过程中没有链接到正确的值?有关于这个的gcc规则吗?实际上你应该在链接时得到多个定义错误。。。除非我遗漏了什么。不,我没有任何错误。可能没有错误,因为
2.c
已完全优化。但肯定有一个未定义的行为,因为当我试图复制它时,它会为我打印
0
#include "1.h"

int a = 6;