我正在使用C89编译器(嵌入式系统)。
我遇到了一些C代码,其中一个转换单元将变量定义为#include<iostream>
using namespace std;
int main()
{
int a[];
int b,c;
cin>>b;
for(int i=0;i<b;i++)
cin>>a[i];
for(c=b;c>=0;c--)
cout<<a[c]<<endl;
return 0;
}
,其中bool varName;
是bool
的{{1}}。另一个翻译单元正向声明该变量,如下所示:typedef
。
这显然是类型不匹配,并且是错误。我的问题是,这违反了什么确切规则?我的下意识反应是这是违反ODR的行为,但是只有一个定义,因此我不确定这是违反ODR的行为。
答案 0 :(得分:5)
所有引用相同对象或函数的声明都应具有 兼容类型否则,行为是不确定的。
C89 standard具有相同的段落。
在链接的段落中进一步解释了指向同一对象的声明:
在不同范围或相同范围中声明的标识符more 一个对象可以多次引用相同的对象或功能 称为链接的过程。共有三种链接:外部链接, 内部的,没有。
在翻译单元和库的集合中, 整个程序,带有外部标识符的特定标识符的每个实例 链接表示相同的对象或功能。一次翻译 单位,带有内部链接的标识符的每个实例表示 相同的对象或功能。没有链接的标识符表示唯一 实体。
兼容类型本质上是指相同的类型,但有一些小的警告(例如extern int foo[];
与extern int foo[3];
兼容)。