03-extern-C

寫在前面

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章