extern "C"与C++中的C函数调用(2)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了extern "C"与C++中的C函数调用(2),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2093字,纯文字阅读大概需要3分钟。
内容图文
![extern "C"与C++中的C函数调用(2)](/upload/InfoBanner/zyjiaocheng/784/a2ff91cd834f4238a3f6a5ddfae0da0a.jpg)
前面已经深入了解过extern "C"了,下面进一步探讨一下extern “C”的使用方法。
1、 C代码中包含extern “C”,C代码无法通过编译([1]中C++中调用C的方法1错误)
代码如下:
//C代码头文件CDemo.h #include <stdio.h> #ifndef C_SRC_DEMO_H #define C_SRC_DEMO_H extern "C" int f(int x,int y); #endif // C_SRC_DEMO_H
//C代码CDemo.c #include "CDemo.h" int f(int x,int y) { printf("In C file\n"); printf("x + y = %d\n",x+y); return 0; }
在Linux下,$:gcc –c CDemo.c 编译通不过
出错信息如下:
结论:在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误。
2、 如果在C头文件中函数声明了函数(f(int x,int y))为extern类型,而在C++中包含该头文件后,再重新声明并添加上extern "C"(extern int f( int x, int y )),C++文件编译通不过([1]中C++中调用C的方法2错误)
代码如下:
//C代码头文件CDemo.h #include <stdio.h> #ifndef C_SRC_DEMO_H #define C_SRC_DEMO_H extern int f(int x,int y); #endif // C_SRC_DEMO_H
//C代码 CDemo.c #include "CDemo.h" int f(int x,int y) { printf("In C file\n"); printf("x + y = %d\n",x+y); return 0; }
//C++代码 cppDemo.cpp #include "CDemo.h" #include <iostream> extern "C" int f(int x,int y); int main() { f(2,3); return 0; }
在Linux下,$:gcc -c CDemo.c 可以通过,并生成CDemo.o文件
$:g++ -c cppDemo.cpp 编译出错
出错信息:
但是还要注意一下两点:
(1)如果不重新声明,即C++代码更改为如下:
//C++代码 cppDemo.cpp #include "CDemo.h" #include <iostream> int main() { f(2,3); return 0; }
编译可以通过,但是将两个.o文件链接起来生成可执行文件时,会出错执行情况如下:
$g++ cppDemo.o CDemo.o –o cppDemo
这说明C++文件没有找到定义在C文件中的f函数,这是因为该函数被C编译器编译后在符号库中的名字与C++编译器产生的名字不同,如, C编译器产生的函数f的符号库中的名字为:f,而C++编译器产生的为_Z1fii(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。
(2)无论C代码中声明有没有包含关键字extern,只要C++中有extern “C”,链接时便不会出错。
参考文献:
[1] 《编写高质量代码:改善C++程序的150个建议》,建议19:明白在C++中如何使用C
转载于:https://www.cnblogs.com/dpflnevergiveup/p/3289024.html
内容总结
以上是互联网集市为您收集整理的extern "C"与C++中的C函数调用(2)全部内容,希望文章能够帮你解决extern "C"与C++中的C函数调用(2)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。