变量声明和定义不匹配

时间:2019-02-06 17:21:27

标签: c c89

我正在使用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的行为。

1 个答案:

答案 0 :(得分:5)

6.2.7p2

  

所有引用相同对象或函数的声明都应具有   兼容类型否则,行为是不确定的。

C89 standard具有相同的段落。

在链接的段落中进一步解释了指向同一对象的声明:

  

在不同范围或相同范围中声明的标识符more   一个对象可以多次引用相同的对象或功能   称为链接的过程。共有三种链接:外部链接,   内部的,没有。

     

在翻译单元和库的集合中,   整个程序,带有外部标识符的特定标识符的每个实例   链接表示相同的对象或功能。一次翻译   单位,带有内部链接的标识符的每个实例表示   相同的对象或功能。没有链接的标识符表示唯一   实体。

兼容类型本质上是指相同的类型,但有一些小的警告(例如extern int foo[];extern int foo[3];兼容)。