大佬教程收集整理的这篇文章主要介绍了extern "C":实现C++和C的混合编程,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
//myfun.h void display(); //myfun.c #include <stdio.h> #include "myfun.h" void display(){ printf("C++:http://c.biancheng/net/cplus/"); } //main.cpp #include <iostream> #include "myfun.h" using namespace std; int main(){ display(); return 0; }在此项目中,主程序是用 C++ 编写的,而 display() 函数的定义是用 C 语言编写的。从表面上看,这个项目很完整,我们可以尝试运行它:
In function `main': undefined reference to `display()'
如上是调用 GCC 编译器运行此项目时给出的错误信息,指的是编译器无法找到 main.cpp 文件中 display() 函数的实现代码。导致此错误的原因,就是因为 C++ 和 C 编译程序的方式存在差异。@H_262_0@@H_262_0@ 通过学习《C++函数重载》一节我们知道,之所以 C++ 支持函数的重载,是因为 C++ 会在程序的编译阶段对函数的函数名进行“再次重命名”,例如: 显然通过重命名,可以有效避免编译器在程序链接阶段无法找到对应的函数。@H_262_0@@H_262_0@ 但是,C 语言是不支持函数重载的,它不会在编译阶段对函数的名称做较大的改动。仍以 void Swap(int a,int b) 和 void Swap(float x,float y) 为例,若以 C 语言的标准对它们进行编译,两个函数的函数名将都是_Swap
。
这也就意味着,使用 C 和 C++ 进行混合编程时,考虑到对函数名的处理方式不同,势必会造成编译器在程序链接阶段无法找到函数具体的实现,导致链接失败。@H_262_0@@H_262_0@
幸运的是,C++ 给出了相应的解决方案,即借助 extern "C",就可以轻松解决 C++ 和 C 在处理代码方式上的差异性。
#ifdef __cplusplus extern "C" void display(); #else void display(); #endif可以看到,当 myfun.h 被引入到 C++ 程序中时,会选择带有 extern "C" 修饰的 display() 函数;反之如果 myfun.h 被引入到 C 语言程序中,则会选择不带 extern "C" 修饰的 display() 函数。由此,无论 display() 函数位于 C++ 程序还是 C 语言程序,都保证了 display() 函数可以按照 C 语言的标准来处理。@H_262_0@@H_262_0@ 再次运行该项目,会发现之前的问题消失了,可以正常运行:
C++:http://c.biancheng/net/cplus/
@H_262_0@ 在实际开发中,对于解决 C++ 和 C 混合编程的问题,通常在头文件中使用如下格式:#ifdef __cplusplus extern "C" { #endif void display(); #ifdef __cplusplus } #endif由此可以看出,extern "C" 大致有 2 种用法,当仅修饰一句 C++ 代码时,直接将其添加到该函数代码的开头即可;如果用于修饰一段 C++ 代码,只需为 extern "C" 添加一对大括号
{}
,并将要修饰的代码囊括到括号内即可。@H_262_0@以上是大佬教程为你收集整理的extern "C":实现C++和C的混合编程全部内容,希望文章能够帮你解决extern "C":实现C++和C的混合编程所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。