寫在前面
今天學一個修飾的關鍵字 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++大神就繞吧,非喜勿噴,畢竟這是個人的學習筆記?