如果我们有一套模块(翻译单位) 符号可以两种方式链接:
'本地'链接 - 给出导出符号'a' 可以链接到适当的模块m1和其他给定的模块 来自不同模块的符号'a'可以链接到其他模块 适当的模块m2。用这种方式连接那里 即使两个模块使用相同的模块也不会发生碰撞 符号名称 - 它们只是不能链接到相同的名称 模块
'全局'链接 - 抛出所有符号名称 在链接时在一个袋子里。它使符号空间污染 并没有必要(我认为这是'设计bug' 在c连接系统中)
C语言可能不强加“全局”链接, 但接头做AFAIK
希望这个问题是合适的。它是关于c语言的 很明显,“ C语言是否强加了全球链接方式 或不?“
//编辑
下面有人说C99强调这一点。 TNX的答案。
第一个c标准是否也强加了?我很好奇 关于oryginal c创作者的意图。 (就像我说的 我认为全球链接在c语言中是一个糟糕的选择)
答案 0 :(得分:5)
来自C99§6.2.2标识符的链接
在构成整个程序的翻译单元和库集中 使用外部链接声明特定标识符 表示相同的对象或 功能即可。在一个翻译单元内,每个内部的标识符声明 链接表示相同的对象或功能。标识符的每个声明都没有 link表示一个独特的实体。
你在谈论带有外部链接的符号,所以不,你不能在整个程序中拥有多个这样的东西。
至于你提出的“本地链接”,如果有多个具有完全相同名称的东西,编译器或链接器将如何知道要绑定哪个符号?
答案 1 :(得分:1)
C中的标识符具有以下三种类型的链接之一:
static
声明extern
声明时,就是这样。这在某种程度上不符合您的意思吗?
答案 2 :(得分:0)
C标准没有提及模块/动态库的任何内容。其他标准涵盖了这些标准,例如:ELF。因此,只要您使用多个模块/动态库,就超出了ISO C的范围。对于小型嵌入式系统,C编译器不应该被要求关注模块。