同时在C语言中创建内部和外部链接

3
我在阅读一篇关于链接(外部、内部和无)的C语言参考文献时,看到了以下内容:
如果同一个标识符在一个翻译单元中既具有内部链接又具有外部链接,其行为是未定义的。
我想知道这种未定义行为是如何发生的。根据我的理解,变量只能拥有一个存储类别,因此它不能同时声明为“静态的”和“外部的”。
那么,在什么情况下,变量可以具有内部和外部链接呢?

1
你可以多次声明同一个函数;并且你有定义和声明之分。也许这就是意图?只是猜测,我不是专家。 - einpoklum
1个回答

2
在这段代码中:
extern int x;
static int x;

第一个声明表明 x 具有外部链接性,而第二个声明表明它具有内部链接性。

只是想澄清一下。如果我在同一作用域中放置extern int xstatic int x,它就无法编译。如果我声明一个静态全局变量并在main()内使用extern关键字,则可以编译。这是你的意思吗? - Abhay Aravinda
抱歉,如果我先在全局范围内声明为静态变量,再声明为 extern 变量,则该代码可以编译通过。感谢你的回答。 - Abhay Aravinda
@AbhayAravinda: externstatic的效果取决于它们出现的位置。如果在具有内部或外部链接的先前声明后声明标识符为extern,新声明只是复制旧声明。它不会将具有内部链接的声明更改为外部链接。 (如果先前的声明未指定链接,则新声明将创建具有外部链接的新标识符。)如果在块作用域中声明标识符为static,则它没有链接。 - Eric Postpischil
因此,extern int x; static int x;x 两个链接,违反了规则,因为第一个声明具有外部链接。但是,static int x; extern int x; 不违反规则,因为第二个声明保留了内部链接。 - Eric Postpischil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接