考虑一下:
#include <stdio.h>
static int b;
int main()
{
{
int b;
{
extern int b;
b = 2;
}
}
printf("%d", b);
}
根据定义,分配值为2的标识符“b”必须是具有外部链接的标识符。但是由于某种原因,'clang'C编译器没有抱怨,并且此代码的输出为'2'。
我假设这是因为C标准中的6.2.2.4点:
对于使用存储类说明符extern声明的标识符 可以看到该标识符的先前声明的范围,31) 如果事先声明指定内部或外部联系,则 后面声明中标识符的链接与 在先前声明中指定的联系。 如果没有事先声明 可见,或者如果先前的声明指定没有链接,那么 标识符具有外部链接。
因为前面的可见声明没有指定链接('int b')。
无论如何我如何在赋值之前进行声明以引用具有内部链接的标识符(而不是具有外部链接的标识符)。
编辑:我看到这个例子是UB,但这不会改变我的问题。
答案 0 :(得分:1)