【问题标题】:External definition for identifier with internal linkage具有内部链接的标识符的外部定义
【发布时间】:2016-08-25 15:12:33
【问题描述】:

我已阅读 C99 标准 6.9.3 中的以下规则

对于在翻译单元中使用内部链接声明的每个标识符,不应有多个外部定义。此外,如果在表达式中使用了用内部链接声明的标识符(而不是作为结果为整数常量的 sizeof 运算符的操作数的一部分),则翻译单元中的标识符应该只有一个外部定义。

我的问题:

(1) 究竟什么是外部定义?

(2)为什么下面的代码没有违反这条规则?

static int a = 1;

int main()
{
    a += 1;
    return 0;
}

【问题讨论】:

  • 注意:C 标准自 ca. 5 年是 C11,而不是 C99。除非您必须维护一些旧代码,否则您应该使用当前(也是唯一的)标准。关于你的问题:任何一本好的 C 书都会回答这个问题。你试图找出自己的什么?你为什么认为/你有哪些论点是否违反了规则?您是否阅读了static 存储类说明符 的含义?没有显示外部定义,main 除外。
  • @Olaf 如果您实际上已经阅读了这两个标准,那么对于这个问题,它们在同一部分中具有相同的词。那么为什么要麻烦它是C99或C11呢? “除了 main 之外,没有显示外部定义。”如果您认真阅读,这正是我的问题。
  • @Olaf 关于我自己为找出答案所做的工作。我不太明白外部定义和外部链接之间的区别,我用谷歌搜索了这个术语,没有任何有用的结果。我实际上已经阅读了一些不错的 C 书籍。我只是不明白标准中使用的术语和语言。满意吗?
  • @Olaf 您的评论充满敌意、无关紧要和错误。你斥责某人在这里发帖而不是读书,但随后表明你对这个话题缺乏了解。 (static int a = 1; 是外部定义)。你现在看起来很傻。以后请客气点,考虑一下你的评论是否真的有用。

标签: c c99 linkage


【解决方案1】:

我相信您将外部定义与使用 extern 关键字的定义混淆了。

定义是用C99/C11 6.9的语义部分写的:

这些被描述为“外部”,因为它们出现在任何外部 函数(因此具有文件范围)。

在您的示例中,代码没有违反规则,因为您只有一个具有内部链接的对象的外部定义,即:

static int a = 1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2014-06-08
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多