c - 为什么 C 编译器在外部名称前加上下划线?

标签 c language-history

我在 C 语言中工作了很长时间,以至于编译器通常在 extern 的开头添加下划线这一事实是可以理解的……但是,another SO question today让我想知道添加下划线的真正原因。 wikipedia article声称原因是:

It was common practice for C compilers to prepend a leading underscore to all external scope program identifiers to avert clashes with contributions from runtime language support

我认为这至少有一定的道理,但它似乎并没有真正回答这个问题,因为如果将下划线添加到所有 externs 中,它对防止冲突没有多大帮助。

有没有人知道前导下划线的基本原理?

添加的下划线是 Unix creat() 系统调用不以“e”结尾的部分原因吗?我听说某些平台上的早期链接器的名称限制为 6 个字符。如果是这样的话,那么在外部名称前面加上下划线似乎是一个彻头彻尾的疯狂想法(现在我只有 5 个字符可以玩...)。

最佳答案

It was common practice for C compilers to prepend a leading underscore to all external scope program identifiers to avert clashes with contributions from runtime language support

如果编译器提供运行时支持,您会认为在运行时支持中为少数外部标识符添加下划线会更有意义!

当 C 编译器首次出现时,在这些平台上用 C 语言编程的基本替代方案是用汇编语言编程,将用汇编语言和 C 语言编写的目标文件链接在一起非常有用(有时仍然有用)。所以真的(恕我直言) 添加到外部 C 标识符的前导下划线是为了避免与您自己的汇编代码中的标识符发生冲突。

(另请参阅 GCC's asm label extension ;请注意,可以将这个前置的下划线视为 name mangling 的简单形式。更复杂的语言(如 C++)使用更复杂的 name mangling,但这就是它开始的地方.)

关于c - 为什么 C 编译器在外部名称前加上下划线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2627511/

相关文章:

c - 查找一系列数字中的当前步骤

java - 左手坐标系的历史原因

Python 历史和设计 : Why issubclass() instead of rich comparisons?

Python:为什么 int 类没有像 `__lt__()` 这样丰富的比较运算符?

python - Python 中静态方法的语法是如何选择的?

c - 为什么输出反转且第一个字符丢失?

C# 使用带有指针等的 C 库

c - 共享内存段dll单独加载其实例

c - 如何使用命令提示符/C合并两个EXE文件