extern “C” 的使用
原因和目的
原因
由于C++支持函数重载,而C语言不支持函数重载,因此C++编译器在编译C++函数生成的函数符号和C语言编译器编译C函数生成的函数符号是有区别的,如下
int add(int a,int b);
// 使用C语言编译器编译生成的函数符号是 _add
// 使用C++编译器编译生成的函数符号类似是 add_int_int
目的
为了能够实现C++代码调用C语言代码、而不出现因为函数生成的符号问题,导致出现符号未定义的问题,我们在C++代码中调用C代码,使用extern “C” 会解决这个问题
注意
extern “C” 是C++的语法,在C语言中无法识别
__cplusplus 是C++自定义宏,主要用来处理C和C++编译混乱问题
示例代码
示例一:C++代码调用C代码
// add.h C语言头文件
#ifndef _ADD_H
#define _ADD_H
int add(int a,int b);
#endif
// add.c C语言源文件
#include "add.h"
int add(int a,int b)
{
return a + b;
}
// test.h C++ 头文件
#ifndef _TEST_H
#define _TEST_H
#ifdef __cplusplus // C++编译器自带的宏
extern "C"{
#include "add.h"
#endif
// 其他代码
#ifdef __cplusplus
}
#endif
#endif
// test.cpp C++源文件
#include "test.h"
#include <iostream>
int main()
{
std::cout << add(1,2) << std::endl;
}
示例二:C++代码调用C代码
// add.h C语言头文件
#ifndef _ADD_H
#define _ADD_H
int add(int a,int b); // 此处加成extern和不加extern都可以
#endif
// add.c C语言源文件
#include "add.h"
int add(int a,int b)
{
return a + b;
}
// test.cpp C++源文件
extern "C"
{
#include "add.h"
}
#include <iostream>
int main()
{
std::cout << add(1,2) << std::endl;
}
示例三:在C代码中调用C++代码
// add.h C++头文件
#ifndef _ADD_H
#define _ADD_H
#ifdef __cplusplus
extern "C" {
#endif
int add(int a, int b);
#ifdef __cplusplus
}
#endif
#endif
// add.cpp C++源文件
#include "test.h"
int add(int a, int b)
{
return a + b;
}
// main.c C语言源文件
#include "add.h"
#include <stdio.h>
int main()
{
printf("%d",add(1,2));
}