使用场景:当C++程序调用第三方框架、函数、库(使用C语言开发的)时,需要使用extern "C"
说明:
1、被 extern "C"修饰的代码会按照C语言的方式去编译
例如:在C语言中不允许函数重载,而在C++中可以,在.cpp文件中,使用extern "C"修饰,将会使用C方式编译
#include <iostream>
using namespace std;
//extern "C" void fun()
//{
//
//}
//
//extern "C" void fun(int c)
//{
//
//}
extern "C" //报错:不允许重载函数的第二个 C 链接
{
void fun()
{
}
void fun(int c)
{
}
}
int main()
{
return 0;
}
2、如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现不可以修饰
扩展:
#define __cplusplus //.cpp文件默认添加的宏,标识C++文件
由于C语言不识别extern "C" 所以在.C文件中会报错,为了避免这种情况,可以在第三方库中引入宏,如下所示:
#ifdef __cplusplus
extern "C" {
#endif
//需要添加的code
#ifdef __cplusplus
}
#endif
还有在定义头文件的时候可能发生重复包含的情况,为了避免这种情况,引入宏
#ifndef ABC
#define ABC
#endif
#pragma once 也可以防止整个文件的内容被重复包含
区别:
#ifdef #define #endif 受C/C++标准的支持,不受编译器的任何限制
#pragma once 较老的编译器不支持,如GCC3.4版本之前,兼容性不够好