【问题标题】:Does this invoke undefined behavior with linkage in C?这是否会通过 C 中的链接调用未定义的行为?
【发布时间】:2012-11-25 06:14:32
【问题描述】:

来自 (6.2.2/7) C99 标准部分

7. 如果在翻译单元中,相同的标识符出现 无论是内部链接还是外部链接,行为都是未定义的。

虽然由于定义冲突,以下会产生编译时错误

// 'x' has external linkage
extern int x;

// Here, 'x' has internal linkage
static int x;

但以下编译正常,

// 'x' has external linkage
extern int x;

void foo() {
  // Here, 'x' has internal linkage
  static int x;
}

这两种情况都会调用未定义的行为吗?

【问题讨论】:

    标签: c c99 undefined-behavior linkage


    【解决方案1】:

    您的问题源于一个错误的假设,即本地声明的静态变量具有内部链接。实际上,在块作用域中声明的静态变量没有链接。见 6.2.2/6

    6 以下标识符没有链接:声明为 不是对象或函数;声明的标识符 成为函数参数;对象的块范围标识符 声明时不使用存储类说明符 extern

    只有文件范围的声明可以有外部或内部链接(加上本地 extern 声明)。

    因此 6.2.2/7 和您的问题根本不适用。

    【讨论】:

    • 感谢您指出这一点。我想这就是当您复制和粘贴内容时会发生的情况:S
    【解决方案2】:

    据我所知,它没有,因为这两个变量不一样。局部变量优先于全局变量,在foo() 的范围内只声明一次。查看汇编器输出 - 编译器很可能会将这两个变量转换为两个不同的符号。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 2014-08-04
      • 1970-01-01
      相关资源
      最近更新 更多