0

如果我们有一组模块(翻译单元)符号可以通过两种方式链接:

  1. “本地”链接 - 给定的导出符号“a”可以链接到适当的模块 m1,而来自不同模块的其他给定符号“a”可以链接到其他适当的模块 m2。使用这种链接方式,即使两个模块使用相同的符号名称也不会发生冲突——它们只是不能链接到同一个模块

  2. “全局”链接 - 所有符号名称在链接时都放在一个包中。它会造成符号空间污染并且没有必要(我认为它是 c 链接系统中的“设计错误”)

C 语言可能不会强加“全局”链接,但链接器会执行 AFAIK

希望这个问题是适当的。它是关于 c 语言的,很明显,“ C 语言是否强制采用全局链接方式?

//编辑

下面有人说C99强加了这一点。TNX 来回答。

第一个c标准也强加了这个吗?我对这里的原始 c 创建者的意图很好奇。(正如我所说,我认为全局链接在 c 语言中是一个糟糕的选择)

4

3 回答 3

5

来自 C99 §6.2.2标识符的链接

在构成整个程序的一组翻译单元和库中,具有外部链接的特定标识符的每个声明都 表示相同的对象或函数在一个翻译单元中,具有内部链接的标识符的每个声明都表示相同的对象或函数。没有链接的标识符的每个声明都表示一个唯一的实体。

您正在谈论具有外部链接的符号,所以不,您在整个程序中不能有多个这样的东西。

至于您提出的“本地链接”,如果有多个名称完全相同的事物,编译器或链接器如何知道要绑定哪个符号?

于 2012-09-30T10:33:28.880 回答
1

C 中的标识符具有以下三种关联的链接类型之一:

  1. internal,当用 声明时static。只能在同一个翻译单元中引用。
  2. external,当声明时extern(这也是默认值)。可以在包含程序的任何翻译单元中引用
  3. none,当它们不是链接的一部分时(宏、自动变量、类型名称,..)

而已。这在某种程度上不是你所说的吗?

于 2012-09-30T10:51:59.513 回答
0

C 标准没有说明模块/动态库。这些由其他标准涵盖,例如:ELF。因此,只要您使用多个模块/动态库,您就超出了 ISO C 的范围。用于微型嵌入式系统的 C 编译器不应该被要求关心模块。

于 2012-09-30T11:24:22.090 回答