我已经在C工作了很长时间以至于编译器通常在一个开头添加一个下划线这一事实extern只是被理解......然而,今天另一个SO问题让我想知道为什么添加下划线的真正原因.一篇维基百科文章称,原因是:
C编译器的常见做法是在所有外部作用域程序标识符之前加上前导下划线,以避免与运行时语言支持的贡献发生冲突
我认为这至少有一个真实的核心,但它似乎并没有真正回答这个问题,因为如果将下划线添加到所有外部,它对防止冲突没有多大帮助.
有没有人有关于领先下划线的理由的良好信息?
增加的下划线部分原因是Unix creat()系统调用不以'e'结尾?我听说某些平台上的早期链接器名称限制为6个字符.如果是这种情况,那么将下划线添加到外部名称似乎是一个彻头彻尾的疯狂想法(现在我只有5个字符可以玩......).
在我们的项目中,我们决定使用下划线为成员变量和一些私有/受保护方法添加前缀(因此使用" _").
在讨论期间,有人声称这是不鼓励的,因为某些平台上的某些编译器/链接器存在某些不兼容性.因为我们希望尽可能便携,所以我想确定.
我还认为在C中用下划线加上前缀全局变量可能是个问题.
这同样适用于C++ - 链接,如果适用,在哪些情况下(平台/编译器/链接器)?
我有一个非常简单的main.c文件:
#include <stdio.h>
int cnt;
extern void increment();
int main()
{
cnt = 0;
increment();
printf("%d\n", cnt);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
甚至更简单hello.asm:
EXTERN cnt
section .text
global increment
increment:
inc dword [cnt]
ret
Run Code Online (Sandbox Code Playgroud)
首先我main.o输入gcc -c main.c
然后我得到hello.o-nasm -f macho hello.asm -DDARWIN
最后,我得到一个可执行文件ld -o main main.o hello.o -arch i386 -lc并得到一个错误:
ld: warning: -macosx_version_min not specified, assuming 10.10
ld: warning:
ignoring file main.o, file was built for unsupported file format ( …Run Code Online (Sandbox Code Playgroud)