我使用的是C89编译器(嵌入式系统)。
我跑进一些C代码,其中一个转换单元定义一个变量作为bool varName;
,其中bool
是typedef
的unsigned char
。另一种翻译单元向前声明变量,如下所示:extern char varName;
。
这显然是一个类型不匹配,是一个错误。我的问题是,这是否违反了什么确切的规则?我下意识的反应是,这是一个ODR违规,但有一个统一的定义,所以我不相信这是一个ODR违反。
这指的是同一对象或函数的所有声明应具有兼容的类型;否则,行为是不确定的。
该C89 standard具有相同的段落。
声明referfing同一对象在上连杆的段落进行进一步说明:
在不同的范围或在同一范围内超过一次声明的标识符可以由通过被称为连接过程来指代相同的对象或功能。有三种联动:外部,内部,没有。
在构成整个程序的一组翻译单元和库,具有外部链接的特定标识符的每个实例表示相同对象或功能。内的一个翻译单元,具有内部链接的标识符的每个实例表示相同对象或功能。没有连接的标识符表示唯一实体。
兼容的类型基本上是指相同类型的,有一些小的警告(例如,extern int foo[];
与extern int foo[3];
兼容)。