外部/内部标识符如何与链接相关?

How does external / internal identifier relate to the linkage?

C2x(及之前)使用以下术语w/o定义:“外部标识符”和“内部标识符”。

这些术语与链接有什么关系?

逻辑上:

对吗?

C17 在这些地方(详尽列表)使用术语“外部标识符”:

  • 第 5.2.4.1/1 段要求符合要求的实现能够翻译和执行至少一个在外部标识符中包含至少 31 个重要初始字符的程序。

  • 第 6.4.2.1/3 段的脚注 72,讨论了链接器不能接受扩展字符的系统上标识符中扩展字符的语义和处理。在这样的系统上,“扩展字符可能会产生一个长的外部标识符。”

  • 第 7.16.1/1 段,关于与 va_* variadic-argument 访问宏/函数的潜在名称冲突。

  • 第 7.17.1/6 段,关于与 stdatomic.h 中声明的通用函数的潜在名称冲突。

  • 第 J.1/1 段,参考第 5.2.4.1 节

  • 第 J.2/1 段,指的是第 7.13 节中描述的未定义行为,如果“程序定义了名称为 setjmp 的外部标识符。”

  • 第 J.2/1 段,参考第 7.16 节

所有这些都是关于链接——也就是说,标识符与对象或函数的关联——而不是关于(比如说)标识符声明的词法上下文。

此外,虽然规范没有明确定义“外部标识符”,在第 6.4.2.1/5 段中将“外部名称”定义为“具有标识符的标识符”外部链接”。它还在几个地方使用“名称”一词作为“标识符”的同义词,通常是在函数名称的上下文中。

那么,我完全有理由将“外部标识符”与“外部名称”和“具有外部链接的标识符”同义。主要的替代方案似乎是“在外部声明中声明的标识符”,但是与外部标识符相关的某些特定规定应仅适用于出现在外部声明中的标识符而不适用于在具有外部声明的块范围内声明的标识符是没有意义的联动


术语“内部标识符”在 C17 中仅出现一次,在第 5.2.4.1/1 段中,要求符合规范的实现能够翻译和执行至少一个程序,该程序在内部标识符中包含至少 63 个重要的初始字符标识符。这与“外部标识符”的出现之一是并行的,而且,与“外部标识符”并行的还有一个定义“内部名称”的相关术语:“一个宏名称或没有外部链接的标识符”(第 6.4.2.1/5 段)。

与“外部标识符”的情况类似,那么,我将“内部标识符”与“内部名称”同义:没有外部链接的标识符。另一种说法是带有内部链接或没有链接的标识符。