C++/C混编,extern "C"用法
2019-10-21 本文已影响0人
cabin523
在c++代码中调用c语言代码,往往会报如下链接错误:
WX20191021-143538@2x.png
LNK2019 无法解析的外部符号 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z),该符号在函数 _main 中被引用
这里报错的原因是 由于c编译的方式和c++编译方式不一致,如果不声明清楚哪些函数是c语言的,就会导致在链接阶段无法成功找到sum函数的具体地址
解决方式,加入extern "C" 进行修饰,让编译器以C语言的方式编译C语言的函数:
//main.cpp
#include <iostream>
using namespace std;
extern "C" {
int sum(int a, int b);
}
int main()
{
cout << sum(1, 2) << endl;
cout << "Hello World!\n";
}
通常情况,对于c语言的函数声明,比较好的做法是抽出单独的.h文件,但是这样就会导致c++文件和c文件都可能会#include该.h文件,从而导致编译失败。
所以在所有的c++文件中,编译器默认定义了一个头变量宏:#define __cplusplus ,但是c语言文件中,没有这个宏,因此用这个方法可以区分文件到底是c语言环境还是c++环境,所以在标准c头文件,需要提供给c++调用的时候,往往c头文件采用如下策略:
//test.h 头文件
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
//可能提供给c++调用的函数
int sum(int a, int b);
#ifdef __cplusplus
}
#endif