博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
extern "C"与C++中的C函数调用(2)
阅读量:6037 次
发布时间:2019-06-20

本文共 1691 字,大约阅读时间需要 5 分钟。

  前面已经深入了解过extern "C"了,下面进一步探讨一下extern “C”的使用方法。

1、  C代码中包含extern “C”,C代码无法通过编译([1]中C++中调用C的方法1错误)

  代码如下:

//C代码头文件CDemo.h#include 
#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 
#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 
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 
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

你可能感兴趣的文章
windows添加和删除服务
查看>>
关于云栖,有点无语的几个地方,管理能不能管?
查看>>
Windows线程的同步与互斥
查看>>
C#进阶系列——MEF实现设计上的“松耦合”(四):构造函数注入
查看>>
AngularJs ng-change事件/指令(转)
查看>>
linux系统下安装两个或多个tomcat
查看>>
ProtoBuffer 简单例子
查看>>
iOS多线程开发系列之(一)NSThread
查看>>
微信小程序初体验(上)- 腾讯ISUX社交用户体验设计成员出品
查看>>
SAP WM Physical Inventory Method ST & PZ
查看>>
一次快速的数据迁移感悟
查看>>
MySQL修改提示符
查看>>
《ELK Stack权威指南(第2版)》一3.6 Java日志
查看>>
C++流的streambuf详解及TCP流的实现
查看>>
《量化金融R语言初级教程》一2.5 协方差矩阵中的噪声
查看>>
mysql到elasticsearch数据迁移踩坑实践-Ali0th
查看>>
Python轻量级数据分析库DaPy
查看>>
beetl 和 shrio 结合
查看>>
相对/绝对路径,cd命令,mkdir/rmdir命令,rm命令
查看>>
tomcat中web.xml各配置项的意义
查看>>