如何在块范围内使用内部链接声明标识符,而无需事先声明该标识符,并且某些链接可见?

时间:2016-01-24 01:23:31

标签: c language-lawyer c11 linkage

考虑一下:

#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,但这不会改变我的问题。

1 个答案:

答案 0 :(得分:1)

您的计划有undefined behaviour。您不能在同一范围内拥有内部和外部链接的标识符。

C11, §6.2.3, 4

  

如果在翻译单元内,同时出现同一个标识符   内部和外部联系,行为未定义。