寫在前面
今天學一個修飾的關鍵字 extern "C",都說C++是C的一個特別實現,所以完全兼容C語法,
被extern "C"修飾的代碼會按照C語言的方式去編譯
名詞解釋
如果函數同時有聲明和實現,要讓函數聲明被extern "C"修飾,函數實現可以不修飾
由於C、C++編譯規則的不同,在C、C++混合開發時,
可能會經常出現以下操作 C++在調用C語言API時,需要使用extern "C"修飾C語言的函數聲明
有時也會在編寫C語言代碼中直接使用extern “C” ,這樣就可以直接被C++調用
碼上封口
#include <iostream>
using namespace std;
// C語言庫
extern "C" void func() {
std::cout << "func()" << std::endl;
}
int main() {
func();
}
//打印結果 func()
進階一下
新建一個C++ 文件,會生成一個.cpp和.hpp的文件,和OC有點類似,
用法也和OC類似,在.hpp聲明要暴露外面的方法,在.cpp是該方法的實現。
寫一個簡單的加法函數sum。
"在.hpp中"
#ifndef sum_hpp
#define sum_hpp
#include <stdio.h>
//函數聲明
int sum(int a, int b);
#endif /* sum_hpp */
'在.cpp中'
#include "sum.hpp"
// _sum
int sum(int a, int b) {
return a + b;
}
'在main.mm中'
#include <iostream>
#import "sum.hpp"
using namespace std;
// C語言庫
extern "C" void func() {
std::cout << "func()" << std::endl;
}
int main() {
func();
cout << "sum的和是:" << sum(2, 4) << endl;
}
運行一下結果是:
func()
sum的和是:6
臥槽:不知不覺把.mm中如何調用C++給泄露了。
哎,不對啊,沒有C++ 文件代用C文件,好,我補上。
爲了區別,創建一個C文件,文件名爲minus
碼上封喉
'在minus.h中'
#ifndef minus_h
#define minus_h
//通過使用宏__cplusplus來區分C、C++環境 現在表明是C++環境
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
int minus(int a, int b);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // !__SUM_H
'在minus.c中'
#include "minus.h"
int minus(int a, int b) {
return a - b;
}
'在sum.hpp中'
添加測試函數聲明 int testMinus(int a, int b);
#ifndef sum_hpp
#define sum_hpp
#include <stdio.h>
//函數聲明
int sum(int a, int b);
int testMinus(int a, int b);
#endif /* sum_hpp */
'在sum.cpp中'
添加函數實現
#include "sum.hpp"
#include "minus.h"
// _sum
int sum(int a, int b) {
return a + b;
}
int testMinus(int a, int b) {
return minus(a, b);
}
'在main.mm中'
添加函數調用
#include <iostream>
#import "sum.hpp"
using namespace std;
// C語言庫
extern "C" void func() {
std::cout << "func()" << std::endl;
}
int main() {
func();
cout << "sum的和是:" << sum(2, 4) << endl;
cout << "minus的結果是:" << testMinus(8, 4) << endl;
}
看下打印結果:
func()
sum的和是:6
minus的結果是:4
今天的課程算是結束了,希望你也能有所收穫。
完整代碼demo,請移步GitHub:DDGLearningCpp
當然C++大神就繞吧,非喜勿噴,畢竟這是個人的學習筆記📒