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. }  

lua调用C/C++函数

  • 2014年08月27日 17:02
  • 1KB
  • 下载

C#调用C/C++ Dll中函数实例代码

  • 2009年04月03日 16:20
  • 940KB
  • 下载

MATLAB调用C/C++函数的方法

通过MATLAB将C/C++函数编译成MEX函数,在MATLAB中就可以调用了。1,首先装编译器Matlab里键入mex -setup,选择你要编译C++的编译器2,写C++函数函数的形式必须是voi...

c/c++中函数调用方式

  • 2008年01月02日 08:43
  • 79KB
  • 下载

LLVM IR和C/C++函数相互调用时的注意事项

一、从C/C++调用LLVM IR函数 主要有两种办法。 1、通过llvm::ExecutionEngine::runFunction()调用。     存在的问题:可以直接调用llvm::Funct...
  • DLite
  • DLite
  • 2015年03月07日 19:25
  • 1911

c调用C++函数

  • 2013年04月11日 18:34
  • 13KB
  • 下载

R 和 C,C++语言函数调用

  • 2014年10月13日 15:51
  • 314KB
  • 下载

C++调用C文件函数简单应用

通常情况下,编程都是用同种语言(或说格式),这样不大会出现不同语言这间的错误 下边介绍一下,在C++语言(.cpp文件)下调用C语言(.c文件)的一种方法(下边分别是三个文件): /*Duke.c...
  • duke56
  • duke56
  • 2012年03月01日 19:53
  • 1269

C++与C之间相互接口和库函数调用

1 C++中调用C的接口我们在阅读一些库的代码的时候, 经常看到有些函数被extern “C”来修饰1.1 extern “C”引入C的库代码如下所示extern "C" void func()...
  • gatieme
  • gatieme
  • 2016年10月04日 00:12
  • 2714
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++调用C函数
举报原因:
原因补充:

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