03-extern-C

東閣堂主發表於2019-02-03

寫在前面

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