【问题标题】:Simultaneously creating internal and external linkages in C在 C 中同时创建内部和外部链接
【发布时间】:2023-10-02 06:26:01
【问题描述】:

我正在阅读有关链接(外部、内部和无)的 C 参考,并遇到以下问题:

如果在一个翻译单元中,相同的标识符出现在两个 内部和外部链接,行为未定义。

我想知道这种未定义的行为是如何发生的。根据我读过的内容,一个变量只能有一个存储类。所以不能同时声明staticextern

那么在什么情况下变量可以同时具有内部和外部链接?

【问题讨论】:

  • 嗯,你可以多次声明同一个函数;你有定义和声明。也许这就是意图?只是推测,IANALL。

标签: c language-lawyer extern internal-link


【解决方案1】:

在这段代码中:

extern int x;
static int x;

第一个声明说x 有外部链接,第二个声明说它有内部链接。

【讨论】:

  • 只是想澄清一下。如果我将 extern int xstatic int x 放在同一范围内,它不会编译。如果我声明一个静态全局变量并在main() 中使用extern 关键字,它就会编译。你是这个意思吗?
  • 对不起。如果我先声明它是静态的,然后是外部的(两者都在全局范围内声明),它会编译。感谢您的回答
  • @AbhayAravinda: externstatic 根据它们出现的位置而产生不同的效果。如果一个标识符在先前的带有内部或外部链接的声明之后声明为extern,则新的声明只是复制旧的;它不会更改具有内部链接到外部的声明。 (如果前面的声明没有指定链接,那么新的声明会创建一个带有外部链接的新标识符。)如果一个标识符在块范围内使用static 声明,则它没有链接。
  • 所以extern int x; static int x;x 两个链接,违反规则,因为第一个声明有外部链接。但是static int x; extern int x; 没有违反规则,因为第二个声明离开了内部链接。
最近更新 更多