C++ 调用C

C++调用C函数详解

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

extern "C"的作用:如果Add(int a, int b)是在c语言编译器编译,而在c++文件使用,则需要在c++文件中声明:extern "C" Add(int a, int b),因为c编译器和c++编译器对函数名的解释不一样(c++编译器解释函数名的时候要考虑函数参数,这样是了方便函数重载,而在c语言中不存在函数重载的问题),使用extern "C",实质就是告诉c++编译器,该函数是c库里面的函数。如果不使用extern "C"则会出现链接错误。

一般象如下使用:

#ifdef _cplusplus

#define EXTERN_C extern "C"

#else

#define EXTERN_C extern

#endif

#ifdef _cplusplus

extern "C"{

#endif

 EXTERN_C int func(int a, int b);

#ifdef _cplusplus

}

#endif


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

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

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

然后是如何使用?

应该怎么使用该语句呢?

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

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

[cpp]  view plain  copy
  1. #ifdef __cplusplus  
  2. extern "C"  
  3. #endif  
  4.  void DeleteStack(Stack stack);  

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

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

[cpp]  view plain  copy
  1. extern "C" {  
  2. void DeleteStack(Stack stack);  
  3. void PrintStack(Stack stack);  
  4. void Pop(Stack stack);  
  5. }  

加上预处理器名字如下:

[cpp]  view plain  copy
  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"

[cpp]  view plain  copy
  1. // CStack.h  
  2. extern "C" {  
  3. #include "Stack.h";  
  4. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值