#ifdef _cplusplus
{extern "C"
#enif
void foo(int,int);
#ifdef _cplusplus
}
#enif
先说说函数签名:
1.在C++中,函数是可重载的,而C是不可重载的,故两者生成函数签名的原则是不同的。c++生成的函数签名可能是_foo_int_int,而C生成的函数签名可能是_foo;
2.编译源文件生成目标文件时,目标文件的内容就是每个函数签名及其位置(符号表);
3.若不带extern “C”,则按c++的规则生成函数签名,当链接c的目标文件时(c的目标文件是用c编译器编译的),在其目标文件找不到相应的签名,从而导致“未找到符号”的错误。
而带extern "C"后,则按c的规则生成函数签名,此时连接c的目标文件就能找到对应的签名,链接成功。
c的目标文件:
c++引用c函数生成的目标文件(不带extern “C”):
c++引用c函数生成的目标文件(带extern “C”):
参考:
https://www.cnblogs.com/xiangtingshen/p/10980055.html
https://www.cnblogs.com/TenosDoIt/p/3163621.html