作者:贴进你的心聆听你的世界 | 2023-08-30 20:50
...在c ++中
1> Johannes Sch..:
你不能.它内置于编译器中,允许您重载函数并在不同的类和类似的东西中具有相同名称的函数.但是你可以编写像C函数一样被破坏的函数.那些可以从C代码调用.但那些不能重载,不能通过"普通"C++函数指针调用:
extern "C" void foo() {
}
上面的函数将像编译器的C函数一样被破坏.这可能包括对名称没有任何改变,或者某些改变,比如它前面的前导"_".
Pax,C编译器也可能会破坏.例如,gcc具有"-fleading-underscore"选项.我记得有些人告诉我macosx用下划线破坏它的C名称.(我不拥有macosx所以我无法检查:)).
马丁约克.你怎么称呼它并不重要.修剪是一个术语,装饰是另一个术语.两者都更改目标文件中使用的名称.维基百科有一篇关于它的文章(好吧,在某些部分,它与自身相矛盾......,但它包含装饰的东西).我同意bk1e
格雷格,它会普遍起作用,但它不对.函数指针必须是指向具有C链接的函数的指针.extern"C"typedef void funt(); int main(){funt*f = foo; F(); 注意,如果它们具有差异链接,则两种函数类型是不同的 - 即使它们不是.
无论您称其为mangling还是名称修饰,事实都是MSVC上的__stdcall C函数从“ func”重命名为“ _func @ 12”或类似名称。此处的更多信息:http://msdn.microsoft.com/zh-cn/library/zxk0tw93(VS.71).aspx
2> befzz..:
另一种方式:
控制汇编代码中使用的名称(gcc规范)
您可以通过在声明符后面编写asm(或__asm__)关键字来指定要在C函数或变量的汇编代码中使用的名称.您可以确保所选的汇编器名称与任何其他汇编器符号或引用寄存器不冲突.
要指定函数的汇编程序名称,请在函数定义之前为函数编写声明,并将asm放在那里,如下所示:
int func () asm ("MYFUNC");
int func ()
{
g++
将编译它,nm -D
输出将是
0000000000001e02 T MYFUNC
代替
0000000000001e02 T _Z4funcv
在g ++ 4.9.2上测试
3> Crashworks..:
你的意思是你可以从库中导出你的功能?
extern"c"{}