【问题标题】:Does the C language impose global linking?C 语言是否强加了全局链接?
【发布时间】:2012-09-30 10:26:51
【问题描述】:

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

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

  2. 'global' 链接 - 抛出所有符号名称 在链接时放在一个袋子里。它使符号空间污染 并且没有必要(我认为这是一个“设计错误” 在 c 链接系统中)

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

希望这个问题是适当的。这是关于c语言的 很明显,“C 语言是否强加了全局链接方式 还是不行?

//编辑

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

第一个 c 标准也强加了这个吗?我很好奇 关于原始 c 创作者的意图。 (就像我说的 我认为全局链接在 c 语言中是一个不好的选择)

【问题讨论】:

  • 呃,C 并没有真正的命名空间,只有作用域,但除此之外,在大多数情况下,1 个标识符 == 1 个符号
  • C 被刻意设计为不对链接器施加超出 Fortran 要求的额外语义。

标签: c compiler-construction linker standards


【解决方案1】:

来自 C99 §6.2.2 标识符的链接

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

你说的是带有外部链接的符号,所以不,你不能在整个程序中拥有多个这样的东西。

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

【讨论】:

  • 以上引用是关于一个模块的,它并没有说明你不能在其他模块中使用相同的符号名称。至于他怎么知道-例如,通过命令行,如果 a 和 b 具有冷却符号,则可以使用它“链接 m1 a,m2 b”而不是“链接 m1 m2 ab” 本地链接会这样做,全局将失败
  • 以上引用是针对外部链接案例的“整个程序”,而不是一个翻译单元(我认为您指的是“模块”一词)。您可以使用 内部链接 拥有多个具有相同名称的符号,但这些符号仅在一个翻译单元中可见。 C 中没有与您所描述的内容相匹配的“本地链接”。
【解决方案2】:

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

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

就是这样。这在某种程度上不是你所指的吗?

【讨论】:

  • 这是releted。但目前尚不清楚这是否全部。如果这是所有全局链接,则不会强加。
  • 对。您对全局链接 所有符号名在链接时都扔在一个包中的定义在C语言规范的链接模型中不存在。
  • 所以链接超出了c语言的范围?是什么定义了它,它的未定义?
  • 没有。 C 中的链接正如我所描述的那样。但是这三个都不匹配你写的,所以没有 grunge Fightr 定义的全局链接
【解决方案3】:

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

【讨论】:

  • 所以链接不是 C 的主题?
  • @grungefightr:动态链接不是 C 的主题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
相关资源
最近更新 更多