无头文件情况下C调用C++函数的连接机制疑问
C与C++无头部文件时的调用连接原理
先看你的示例代码:
main.c 代码
void Run( void ) ; int main(void) { Run() ; }
run.cpp 代码
static MyClass gMyClassInstance; extern "C" { void Run( void ) { gMyClassInstance->Run(); } }
核心原理拆解:
函数声明的作用:main.c里的
void Run( void ) ;是一个函数原型声明,它不需要放在头文件里——只要在调用Run()之前告诉编译器:“有个叫Run的函数,参数和返回值是这样的”,编译器就能正确生成调用这个函数的机器指令,保证编译阶段通过,这一步不涉及实际的函数实现。C与C++的名字修饰差异:C++编译器默认会对函数名做“名字修饰(Name Mangling)”,比如把
Run()改成类似_Z3Runv的符号名,用来支持函数重载、命名空间等C没有的特性;但C编译器不会做这个修饰,会直接用原函数名Run作为符号。extern "C"的关键作用:run.cpp里的
extern "C"块告诉C编译器,里面的Run()函数要按照C的规则生成符号——也就是直接用Run作为符号名,而不是经过C修饰后的名字。这样,main.c编译出来的目标文件(main.o)里引用的符号是Run,run.cpp编译出来的目标文件(run.o)里导出的符号也是Run,两者能精准对应。链接阶段的符号匹配:当链接器把所有目标文件打包成可执行文件时,它会查找main.o里未解析的
Run符号,然后在run.o里找到对应的定义,把两者的地址关联起来,最终完成调用的连接。
所以哪怕没有头文件,只要满足“C侧有函数声明、C++侧用extern "C"导出对应符号”这两个条件,就能实现跨语言调用的连接。
内容的提问来源于stack exchange,提问作者schanti schul
相关产品推荐
相关产品推荐

