C语言是否强加全局链接?

时间:2012-09-30 10:26:52

标签: c compiler-construction linker standards

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

  1. '本地'链接 - 给出导出符号'a' 可以链接到适当的模块m1和其他给定的模块 来自不同模块的符号'a'可以链接到其他模块 适当的模块m2。用这种方式连接那里 即使两个模块使用相同的模块也不会发生碰撞 符号名称 - 它们只是不能链接到相同的名称 模块

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

  3. C语言可能不强加“全局”链接, 但接头做AFAIK

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

    //编辑

    下面有人说C99强调这一点。 TNX的答案。

    第一个c标准是否也强加了?我很好奇 关于oryginal c创作者的意图。 (就像我说的 我认为全球链接在c语言中是一个糟糕的选择)

3 个答案:

答案 0 :(得分:5)

来自C99§6.2.2标识符的链接

  

在构成整个程序的翻译单元和库集中   使用外部链接声明特定标识符 表示相同的对象或   功能即可。在一个翻译单元内,每个内部的标识符声明   链接表示相同的对象或功能。标识符的每个声明都没有   link表示一个独特的实体。

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

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

答案 1 :(得分:1)

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

    使用static声明
  1. 内部。只能在同一个翻译单元中引用。
  2. 使用extern声明时,
  3. 外部(这也是默认设置)。可以在包含程序的任何翻译单元中引用
  4. ,当它们不属于链接时(宏,自动变量,类型名称,..)
  5. 就是这样。这在某种程度上不符合您的意思吗?

答案 2 :(得分:0)

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