【发布时间】:2019-06-05 14:51:38
【问题描述】:
我已经在 C 语言中工作了很长时间,以至于编译器通常会在 extern 的开头添加下划线这一事实已被理解...但是,another SO question today 让我想知道为什么添加下划线。一位wikipedia article 声称原因是:
C 编译器的常见做法是在所有外部范围程序标识符前加上前导下划线,以避免与运行时语言支持的贡献发生冲突
我认为这至少有一个道理,但它似乎并没有真正回答这个问题,因为如果将下划线添加到所有外部,它对防止冲突没有多大帮助。
有没有人对前导下划线的基本原理有很好的信息?
添加的下划线是 Unix creat() 系统调用不以“e”结尾的部分原因吗?我听说某些平台上的早期链接器名称限制为 6 个字符。如果是这样的话,那么在外部名称前加上下划线似乎是一个彻头彻尾的疯狂想法(现在我只有 5 个字符可以玩......)。
【问题讨论】:
-
应该注意的是,这种行为在现代 ELF 系统上并不适用。显然,这在 aout/coff 平台中很常见。
-
为什么 Clang 在 OS X 上这样做?怎么关掉?
标签: c language-history