2

来自 (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;
}

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

4

2 回答 2

3

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

6以下标识符没有链接: 声明为对象或函数以外的任何东西的标识符;声明为函数参数的标识符;没有存储类说明符extern声明的对象的块范围标识符。

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

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

于 2012-11-25T06:33:19.443 回答
1

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

于 2012-11-25T06:26:23.570 回答