第三个应该x
参考什么:
#include <stdio.h>
static char x = '1';
int main(void)
{
char x = '2';
{
extern char x;
printf("%c\n", x);
}
}
Run Code Online (Sandbox Code Playgroud)
这出现在这个答案中,并且:
x
的extern char x
是指第一x
,并打印"1".C 2018 6.2.2 4说:
对于在该标识符的先前声明可见的范围内使用存储类说明符extern声明的标识符,如果先前声明指定内部或外部链接,则后面声明中的标识符的链接与链接相同在先前的声明中指明.如果没有先前声明可见,或者先前声明未指定链接,则标识符具有外部链接.
由于有两个先前的声明x
,以下每个"if"子句的条件为真,第一个先前声明的第一个,第二个先前声明的第二个:
Clang在这里的行为与使用第一个子句是一致的,因此第三个子句x
具有内部链接并且引用与第一个相同的对象x
.GCC在这里的行为与使用第二个子句是一致的,因此第三个子句x
具有外部链接并且与第一个x
具有内部链接的第一个冲突.
C标准是否为我们提供了解决这些问题的方法?