相关疑难解决方法(0)

对于使用extern的新声明,如何解决多个先前声明?

第三个应该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)

这出现在这个答案中,并且:

  • 在苹果LLVM 9.1.0铛-902-0.39.2,所述xextern char x是指第一x,并打印"1".
  • GCC 8.2不接受此源文本.,抱怨:"错误:变量先前声明'静态'重新声明'extern'".

C 2018 6.2.2 4说:

对于在该标识符的先前声明可见的范围内使用存储类说明符extern声明的标识符,如果先前声明指定内部或外部链接,则后面声明中的标识符的链接与链接相同在先前的声明中指明.如果没有先前声明可见,或者先前声明未指定链接,则标识符具有外部链接.

由于有两个先前的声明x,以下每个"if"子句的条件为真,第一个先前声明的第一个,第二个先前声明的第二个:

  • ...如果先前声明指定内部或外部链接,则后面声明中的标识符的链接与先前声明中指定的链接相同.
  • ...如果先前声明未指定链接,则标识符具有外部链接.

Clang在这里的行为与使用第一个子句是一致的,因此第三个子句x具有内部链接并且引用与第一个相同的对象x.GCC在这里的行为与使用第二个子句是一致的,因此第三个子句x具有外部链接并且与第一个x具有内部链接的第一个冲突.

C标准是否为我们提供了解决这些问题的方法?

c language-lawyer

8
推荐指数
1
解决办法
145
查看次数

标签 统计

c ×1

language-lawyer ×1