【问题标题】:Variable declaration and definition mismatch变量声明和定义不匹配
【发布时间】:2019-02-06 17:21:27
【问题描述】:

我正在使用 C89 编译器(嵌入式系统)。

我遇到了一些 C 代码,其中一个翻译单元将变量定义为bool varName;,其中booltypedefunsigned char。另一个翻译单元 forward 声明变量如下:extern char varName;

这显然是类型不匹配,是一个错误。我的问题是,这违反了什么确切的规则?我的下意识反应是它违反了 ODR,但只有一个定义,所以我不确定这是否违反了 ODR。

【问题讨论】:

  • 您对以下哪种语言感兴趣?您说的是 C,但您列出了三个 C++ 标记。
  • 我认为它不是有效的 C++,因为 bool 本身就是一种类型。
  • 您使用的是 C 还是 C++?
  • 如果不清楚您讨论的是哪种语言和版本,这很难正确回答
  • char varName; 是一个定义,而不仅仅是一个声明。

标签: c c89


【解决方案1】:

6.2.7p2

引用同一对象或函数的所有声明都应具有 兼容类型;否则,行为未定义。

C89 standard 有相同的段落。

引用同一对象的声明在链接段落中进一步解释:

在不同作用域或同一作用域中声明的标识符更多 不止一次可以通过 a 来引用同一个对象或函数 过程称为联动。联动方式有3种:外联, 内部的,没有。

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

兼容类型本质上意味着相同的类型,但有一些小的注意事项(例如,extern int foo[];extern int foo[3]; 兼容)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多