这会在C中使用链接调用未定义的行为吗?

时间:2012-11-25 06:14:33

标签: c c99 undefined-behavior linkage

从第(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;
}

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

2 个答案:

答案 0 :(得分:3)

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

  

6 以下标识符没有链接:声明为的标识符   是对象或功能以外的任何东西;声明的标识符   成为一个函数参数;对象的块作用域标识符   声明没有存储类说明符 extern

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

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

答案 1 :(得分:1)

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