首先,请帮助我找到一个更准确地描述情况的更好的标题。我创建了以下在调试实际(嵌入式)代码时偶然发现的问题的简化版本。
考虑以下文件代码t1.c
:
#include <stdio.h>
int A;
void f() { printf("%d\n", A); }
extern void g();
void main(void)
{
g(); A=1; g();
A++;
f();
}
和代码t2.c
:
#include <stdio.h>
double A;
void g()
{
A += 1.0;
printf("%f\n", A);
}
现在编译并运行如下代码:
gcc -Wall t1.c t2.c -o t && ./t
给
1.000000
2.000000
1
请注意,这两个文件都包含一个A
具有不同类型的全局变量调用。我预计会出现链接错误,因为符号 A 存在多次。
当我初始化两个变量之一时,我实际上得到了一个链接警告(对象大小在不同的 .o 中变化),当我初始化它们两个时,我得到一个错误(多个定义)。
我用 gcc 4.7 和 4.4 试过这个。
这是预期的行为吗?如果是这样,我可以做些什么来指示工具链(基于 gcc)发出警告吗?
这是一个错误吗?