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;