如果我们有一组模块(翻译单元) 符号可以通过两种方式链接:
“本地”链接 - 给定导出符号“a” 可以链接到适当的模块 m1 和其他给定的 来自不同模块的符号“a”可以链接到其他模块 合适的模块m2。用这种链接方式 即使两个模块使用相同的模块也不会发生冲突 符号名称 - 它们不能链接到相同的名称 模块
“全局”链接 - 抛出所有符号名称 在链接时装在一个袋子里。造成符号空间污染 而且没有必要(我认为这是一个“设计错误” 在 C 链接系统中)
C 语言可能不会强加“全局”链接, 但链接器确实如此
希望这个问题是合适的。这是关于c语言的 很明显,“C 语言是否强加了全局链接方式? 还是不?”
//编辑
下面说C99强加了这一点。 TNX 寻求答案。
第一个 c 标准也强加了这一点吗?我很好奇 关于原始c创作者的意图在这里。 (正如我所说 我认为全局链接在 C 语言中是一个糟糕的选择)
来自 C99 §6.2.2 标识符的链接
在构成整个程序的翻译单元和库集合中,每个 使用 外部链接 声明特定标识符表示相同的对象或 功能。在一个翻译单元内,每个带有 internal 的标识符声明 连接表示相同的对象或功能。每个标识符的声明都没有 链接表示一个独特的实体。
您正在谈论具有外部链接的符号,所以不,在整个程序中不能有多个这样的东西。
至于您提出的“本地链接”,如果有多个名称完全相同的东西,编译器或链接器如何知道要绑定哪个符号?
C 中的标识符具有以下三种类型的 linkage 关联之一:
static
声明时。只能在同一翻译单元中引用。extern
声明时(这也是默认值)。可以在组成程序的任何翻译单元中引用就是这样。这在某种程度上不符合您所说的吗?
C 标准没有提及任何有关模块/动态库的内容。其他标准涵盖了这些标准,例如:ELF。因此,只要您使用多个模块/动态库,您就处于 ISO C 的范围之外。小型嵌入式系统的 C 编译器不需要关心模块。