从第(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;
}
这两种情况都会调用未定义的行为吗?
答案 0 :(得分:3)
您的问题源于一个错误的假设,即本地声明的静态变量具有内部链接。实际上,块作用域中声明的静态变量具有无链接。见6.2.2 / 6
6 以下标识符没有链接:声明为的标识符 是对象或功能以外的任何东西;声明的标识符 成为一个函数参数;对象的块作用域标识符 声明没有存储类说明符 extern 。
只有文件范围声明可以有外部或内部链接(加上本地extern
声明)。
因此6.2.2 / 7并且您的问题根本不适用。
答案 1 :(得分:1)
据我所知,它没有,因为这两个变量不一样。局部变量优先于全局变量,并且在foo()
的范围内,它只被声明一次。请参阅汇编程序输出 - 编译器很可能将这两个变量转换为两个不同的符号。