我怎样才能避免名字被弄乱? 我如何避免C++中的名字窜改? < p>你的意思是你可以从库导出函数吗?

我怎样才能避免名字被弄乱? 我如何避免C++中的名字窜改? < p>你的意思是你可以从库导出函数吗?,c++,C++,你不能。它内置在编译器中,允许您重载函数,并在不同的类中使用相同名称的函数等等。但是您可以编写像C函数一样被破坏的函数。这些可以从C代码中调用。但是这些不能重载,不能被“正常”C++函数指针调用: extern "C" void foo() { } 上面的函数将像编译器的C函数一样被破坏。这可能包括对名称的任何更改,或者一些更改,例如名称前面的前导“u”之类的更改 其他方式: 汇编程序代码中使用的控制名称() 您可以通过在声明符后写入asm(或\uu asm\uuu)关键字来指定要在C函数或

你不能。它内置在编译器中,允许您重载函数,并在不同的类中使用相同名称的函数等等。但是您可以编写像C函数一样被破坏的函数。这些可以从C代码中调用。但是这些不能重载,不能被“正常”C++函数指针调用:

extern "C" void foo() {

}
上面的函数将像编译器的C函数一样被破坏。这可能包括对名称的任何更改,或者一些更改,例如名称前面的前导“u”之类的更改

其他方式:

汇编程序代码中使用的控制名称()

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

要指定函数的汇编器名称,请在函数定义之前编写函数声明,并将asm放在那里,如下所示:

g++
将编译它,并且
nm-D
将输出

0000000000001e02 T MYFUNC
而不是

0000000000001e02 T _Z4funcv

在g++4.9.2上测试,Schaub的答案实际上是不正确的。避免名称损坏的最常见原因是,您正在构建一个共享库(在Windows上是一个DLL),该库由您不控制的客户端软件使用,该软件需要某些导出的函数名。由于编译器之间的混乱差异,此类接口在历史上避免了名称混乱

你要做的就是这样。首先,在源代码预置<代码>外“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...

您可以使用依赖性沃克来验证它是否正确。< /p> < p>如果您想编译WASM,可以通过<代码> WASM LD 链接器,通过<代码> CLAN-WL添加“<代码> -DEMALKEX/UDCOR>选项”——DimoLe>/Cuff>

只是一个小号NIT:这样的函数当然可以从C++函数指针调用:Extn“C”空脚(){PRTNF(PrTNF)“foo\n”);}int main(){void(*f();f=foo;f();}Pax,C编译器也可能会损坏。例如,gcc有“-fleading underline”选项。我记得有人告诉我macosx会用下划线损坏其C名称。(我没有macosx,所以无法检查:)).Greg,它通常可以工作,但不正确。函数指针必须是指向具有C链接的函数的指针。extern“C”typedef void funt();int main(){funt*f=foo;f();}请注意,如果两个函数类型具有不同的链接,则它们是不同的-即使它们没有链接。无论您将其称为“损坏”还是“名称装饰”,事实仍然是MSVC上的u stdcall C函数将从“func”重命名为_func@12“或类似的。更多信息:马丁·约克。不管你怎么称呼它。破损是一个术语,装饰是另一个术语。两者都会更改对象文件中使用的名称。维基百科有一篇关于它的文章(好吧,在某些部分,它自相矛盾…,但它包含装饰材料)。我同意bk1e
gcc -shared -mwindows -Wl,--kill-at -Werror ... -o MyLib.dll MyLib.cpp -lkernel32 -l...