在c++代碼中調(diào)用c語言代碼,往往會(huì)報(bào)如下鏈接錯(cuò)誤:

WX20191021-143538@2x.png
LNK2019 無法解析的外部符號 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z),該符號在函數(shù) _main 中被引用
這里報(bào)錯(cuò)的原因是 由于c編譯的方式和c++編譯方式不一致,如果不聲明清楚哪些函數(shù)是c語言的,就會(huì)導(dǎo)致在鏈接階段無法成功找到sum函數(shù)的具體地址
解決方式,加入extern "C" 進(jìn)行修飾,讓編譯器以C語言的方式編譯C語言的函數(shù):
//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語言的函數(shù)聲明,比較好的做法是抽出單獨(dú)的.h文件,但是這樣就會(huì)導(dǎo)致c++文件和c文件都可能會(huì)#include該.h文件,從而導(dǎo)致編譯失敗。
所以在所有的c++文件中,編譯器默認(rèn)定義了一個(gè)頭變量宏:#define __cplusplus ,但是c語言文件中,沒有這個(gè)宏,因此用這個(gè)方法可以區(qū)分文件到底是c語言環(huán)境還是c++環(huán)境,所以在標(biāo)準(zhǔn)c頭文件,需要提供給c++調(diào)用的時(shí)候,往往c頭文件采用如下策略:
//test.h 頭文件
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
//可能提供給c++調(diào)用的函數(shù)
int sum(int a, int b);
#ifdef __cplusplus
}
#endif