【发布时间】:2019-02-25 04:13:45
【问题描述】:
啊.h
void addr(void);
交流
#include <stdio.h>
int x;
void addr(void) {
printf("a:x=%p\n", &x);
}
b.c
#include <stdio.h>
#include "a.h"
char x;
int main(void) {
addr(); /* a:x=0x601044 */
printf("b:x=%p\n", &x); /* b:x=0x601044 */
return 0;
}
为什么编译器或链接器没有抱怨两个具有不同类型和相同标识符 (x) 的 extern 声明,而是默默地链接在一起?
环境:
$ gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
$ gcc -o test -Wall -std=c11 a.c b.c
【问题讨论】:
-
请添加相关的编译器、版本和编译选项
-
初始化无变量编译,初始化一个变量编译,但初始化两个变量似乎会引发重复符号错误。也许编译器/链接器会在可能的情况下隐式解析变量类型。