23,124
社区成员
发帖
与我相关
我的任务
分享
int i;
main()
{
//extern int i;
printf("%d\n", i);
}
int i = 10;
int x; /* C (Common) 声明(可能同时也定义)变量, 到了链接阶段, */
/* 1. 如果没在其他模块发现同名(D)符号,作为未初始化的全局变量, 放在BSS */
/* 2. 如果有在其他模块发现同名(D)符号,作为已初始化的全局变量, 放在数据段 */
int y = 1; /* D (Data) 定义变量,作为已初始化的全局变量, 放在数据段 */
extern int z; /* U (Undefined), 声明变量, 到了链接阶段 */
/* 1. 如果在其他模块有且仅有一个类型(D)的同名符号,将此符号解析到此 */
/* (D)符号,作为已初始化的全局变量, 放在数据段 */
/* 2. 如果在其他模块有两个或更多的类型(D)的同名符号,*/
/* 报告“重复定义”,链接失败 */
/* 3. 如果在其他模块未发现类型(D)的同名符号,但是至少有一个类型(C) */
/* 的同名符号, 将此符号解析到此(C)符号上,
/* 作为未初始化的全局变量, 放在BSS */
// a.c
int i; // 0000000000000004 C i
// b.c
int i = 10; // 0000000000000000 D i
"C" The symbol is common.
Common symbols are uninitialized data. When linking, multiple
common symbols may appear with the same name. If the symbol is
defined anywhere, the common symbols are treated as undefined references.
"D" The symbol is in the initialized data section.
// a.c
int i = 10;
// b.c
int i = 10;