符号名前加下划线

符号名前加下划线

Content #

约在20世纪70年代以前,编译器编译源代码产生目标文件时,符号名与相应的变量和函数的名字是一样的。比如一个汇编源代码里面包含了一个函数foo,那么汇编器将它编译成目标文件以后,foo在目标文件中的相对应的符号名也是foo。

当后来UNIX平台和C语言发明时,已经存在了相当多的使用汇编编写的库和目标文件。这样就产生了一个问题,那就是如果一个C程序要使用这些库的话,C语言中不可以使用这些库中定义的函数和变量的名字作为符号名,否则将会跟现有的目标文件冲突。比如有个用汇编编写的库中定义了一个函数叫做main,那么我们在C语言里面就不可以再定义一个main函数或变量了。同样的道理,如果一个C语言的目标文件要用到一个使用Fortran语言编写的目标文件,我们也必须防止它们的名称冲突。

为了防止类似的符号名冲突,UNIX下的C语言就规定,

C语言源代码文件中的所有全局的变量和函数经过编译以后,相对应的符号名前加上下划线“_”。

而Fortran语言的源代码经过编译以后,所有的符号名前加上“”,后面也加上“”。比如一个C语言函数“foo”,那么它编译后的符号名就是“_foo”;如果是Fortran语言,就是“_foo_”。

GCC编译器也可以通过参数选项“-fleading-underscore”或“-fno-leading-underscore”来打开和关闭是否在C语言符号前加上下划线。

From #

程序员的自我修养