我怎么能避免名字损坏?

时间:2009-02-07 21:40:38

标签: c++

...在c ++中

5 个答案:

答案 0 :(得分:26)

你做不到。它内置于编译器中,允许您重载函数并在不同的类和类似的东西中具有相同名称的函数。但是你可以编写像C函数一样被破坏的函数。那些可以从C代码调用。但是那些不能被重载并且不能被“普通”C ++函数指针调用:

extern "C" void foo() {

}

上面的函数将像编译器的C函数一样被破坏。这可能包括对名称没有任何改变,或者某些改变,比如它前面的前导“_”。

答案 1 :(得分:11)

其他方式:

控制汇编代码中使用的名称gcc spec.

  

您可以通过编写 asm (或 __ asm __ )指定要在 C函数或变量的汇编程序代码中使用的名称声明者之后的关键字。您可以确保所选的汇编器名称与任何其他汇编器符号或引用寄存器不冲突。

     

要指定函数的汇编程序名称,请在函数定义之前为函数写一个声明,然后将 asm 放在那里,如下所示:

 int func () asm ("MYFUNC");

 int func ()
 {

g++将对其进行编译,nm -D输出将为

0000000000001e02 T MYFUNC

而不是

0000000000001e02 T _Z4funcv

在g ++ 4.9.2上测试

答案 2 :(得分:7)

你的意思是你可以从库中导出你的功能吗? extern "c" {}

答案 3 :(得分:1)

Schaub的回答实际上是错误的。避免名称修改的最常见原因是,您正在构建一个共享库(在Windows上为DLL),该共享库供不受控制的客户端软件使用,它们需要某些导出的函数名。由于编译器之间的改型差异,此类接口在历史上避免了名称改型。

这是您要做的。首先,在源代码中添加extern "C",以摆脱C ++的混乱;尽管这仍然使C混乱。其次,在编译时使用-Wl,--kill-at命令行选项。

示例:

extern"C" __declspec(dllexport) hresult __stdcall MyExportedFunction( ... )
{
     ....
}

并使用:

gcc -shared -mwindows -Wl,--kill-at -Werror ... -o MyLib.dll MyLib.cpp -lkernel32 -l...

您可以使用Dependency Walker验证是否正确。

答案 4 :(得分:0)

如果要编译为wasm,可以通过--demanglewasm-ld选项添加到clang -Wl,--demangle链接器中