C++调用C函数

原创 2012年03月24日 09:41:42
前言:以前见到extern "C"这样的语句,只是简单地知道跟外部链接有关,但是没有深刻理解它的意思。

首先,为什么要使用extern "C"修饰符?

C++调用其它语言的函数,由于编译器生成函数的机制不一样,所以需要经过特殊处理,才可以调用。调用C语言的函数,需要在函数声明的地方语句extern "C"。如果不使用该语句,在链接的时候,编译器就会报以下这种错误。

Test.obj : error LNK2019: 无法解析的外部符号 "void __cdecl DeleteStack(struct _Node *)" (?DeleteStack@@YAXPAU_Node@@@Z),该符号在函数 _main 中被引用。


然后是如何使用?

应该怎么使用该语句呢?

刚开始,我简单地在C++源文件的前面使用该语句声明,但是还是出错,而且是在编译阶段就报错。

  1. error C2732: 链接规范与“DeleteStack”的早期规范冲突。  

为什么会出现这个错误呢?因为C++源文件已经引入了C的头文件,在头文件里,声明该函数时没有extern修饰,而这里有extern修饰,所以冲突了。解决的办法有两个。

一。在C头文件中加上extern修饰符。

直接加,也不行。因为C源文件也包含了这个头文件,当编译C源文件时,就会出现错误。所以,需要一种机制来区分是编译C还是C++文件。方法如下:

  1. #ifdef __cplusplus  
  2. extern "C"  
  3. #endif  
  4.  void DeleteStack(Stack stack);  

因为在编译C++文件时,自动定义预处理器名字__cplusplus,而编译C时,没有该处理器名字。所以只有编译C++时,才有符号extern “C”。

此外,链接指示extern "C"有单个和复合两种形式。以上为单个形式,复合形式可以同时将几个函数声明为extern "C"

  1. extern "C" {  
  2. void DeleteStack(Stack stack);  
  3. void PrintStack(Stack stack);  
  4. void Pop(Stack stack);  
  5. }  

加上预处理器名字如下:

  1. #ifdef __cplusplus  
  2. extern "C" {  
  3. #endif  
  4.   
  5. void DeleteStack(Stack stack);  
  6. void PrintStack(Stack stack);  
  7. void Pop(Stack stack);  
  8.   
  9. #ifdef __cplusplus  
  10. }  
  11. #endif  

二。编写一个C++风格的头文件,在这里添加extern修饰符。

使用方法一,很简单。但是如果该头文件是别人写好,你无法修改。这个时候就要使用其它方法了。方法是定义C++自己的头文件,文件名为"CStack.h"

  1. // CStack.h  
  2. extern "C" {  
  3. #include "Stack.h";  
  4. }  

c调用c++函数(包括类成员函数)的方法

声明:引用两处博客 http://blog.csdn.net/lg1259156776/ http://blog.csdn.net/caspiansea/article/details/9...
  • z1002137615
  • z1002137615
  • 2016年03月01日 17:24
  • 898

如何有效解决C与C++的相互调用问题

    在实际工作中可能经常要进行C和C++的混合编程,C++调用C语言的代码通常都比较容易,但也有一些细节需要注意。C要调用C++的代码就略为麻烦一些,因为C不支持面向对象的特征。首先我们来看一下C...
  • gobitan
  • gobitan
  • 2007年03月18日 14:02
  • 15640

C++程序调用C函数

这种需求很多,又因为C++和C是两种完全不同的编译链接处理方式,所以要稍加处理.总结大致有两大类实现方法.文中给出的是完整的,具体的,但又最基本最简单的实现,至于理论性的东西在网上很容易搜索的到. 一...
  • ustcgy
  • ustcgy
  • 2009年12月23日 15:41
  • 9381

c++和c语言中的函数相互调用的问题

1、如何C++程序要调用 已编译后的C函数,该怎么办?
  • wuli2496
  • wuli2496
  • 2014年11月01日 13:12
  • 1136

Python调用c/c++函数(1)

    Python开发效率高,运行效率低。而c/c++恰恰相反。因此在python脚本中调用c/c++的库,对python进行扩展,是很有必要的。使用python api,http://www.py...
  • marising
  • marising
  • 2008年08月28日 20:15
  • 31914

C++调用C文件中定义的函数接口

今天测试了一下C++ 源文件中要调用C源文件定义的函数,最初在头文件中声明函数,C源文件和C++源文件中都include头文件,导致CodeBlock编译不通过。经过修改和测试,发现在C源文件中不能i...
  • aitazhixin
  • aitazhixin
  • 2016年09月10日 16:10
  • 1350

C函数和C++函数相互调用

实例解说 这个例子,示例了两点 C 如何调用C++对象里的函数 C++ 如何调用C的函数 共两个文件,test.c 和 main.cpp,代码解释如下: 在main....
  • imxiangzi
  • imxiangzi
  • 2016年01月15日 09:11
  • 753

在.c文件中调用c++定义的函数

问题描述:用c语言写的程序
  • wang11234514
  • wang11234514
  • 2014年04月19日 16:57
  • 2702

C++中调用C代码,出现“Undefined Reference…”

问题现象:          最近Android开发中,在C++中调用C代码,出现“Undefined Reference…”问题。 问题分析:     “Undefined Reference…”提...
  • CDUT100
  • CDUT100
  • 2016年04月29日 16:10
  • 904

C/C++ 中调用matlab 的两种方式

matlab中在数值计算方面有很大优势,如:矩阵计算 求解方程等。 在C/C++开发中,我们实现相同的功能往往很复杂,我们可以在C/C++开发环境下调用matlab进行混合编程。 下面主要...
  • u013575812
  • u013575812
  • 2016年04月20日 14:27
  • 10988
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++调用C函数
举报原因:
原因补充:

(最多只允许输入30个字)