我擦 遇到個大坑啊 C和C++混合編譯問題
在C語言中,編譯器對於函式 int test()和int test(int a)的編譯結果得到的函式名是一樣的,所以C語言不能過載
而在C++中int test()和int test(int a)編譯後生成不同名字的函式,所以支援過載
1.這就產生了問題,如果在C++中呼叫C語言的int test(int a)函式,會連線錯誤,因為編譯後找不到對應名稱的函式(c和cpp生成的函式名不同)
所以需要在CPP檔案中如果要使用int test(int a)函式,需要在(include下面)用extern "C" int test(int a)
如果呼叫的C函式特別多,也可以用下面的方式宣告
extern "C"
{
需要呼叫的c語言函式
int test(int a);
}
或者
extern "C"
{
#include "XXX.h"
這樣會把XXX.h裡面宣告的函式都變成C函式生成規則
}
2.如果要在.c檔案中需要呼叫CPP函式需要在.cpp檔案中用extern "C"{
cpp函式的實現
}
然後系統在編譯這個函式的時候就會自動按照C語言的規則進行編譯
3.如果要寫一套函式庫,同時提供給C和CPP使用,那必須用C語言規則進行編譯
如果是寫在CPP檔案中的,必須要加extern "C"宣告
--1.在cpp檔案中加上extern,讓函式編譯是用c規則編譯
--2.在呼叫者的cpp檔案中用extern "C"{include 引入標頭檔案}
4.但是3的實現比較麻煩,只要呼叫通用函式就得在呼叫者的cpp檔案中用extern引入標頭檔案
解決方法:在通用函式的.h和.cpp檔案中,都用extern來宣告--(但是此時就會讓c呼叫不了通用函式,因為c裡面沒有extern,c包含的標頭檔案包含extern,所以編譯通不過)
所以要在通用函式的.h檔案裡面用
#ifdef __cplusplus
extern "C" {
#endif
int sum(int, int);
#ifdef __cplusplus
}
#endif
因為cpp在編譯時會自動生成__cplusplus這個巨集,所以利用這一點,可以實現c檔案中不包含extern
cpp中包含extern
相關文章
- c++使用遇到的問題C++
- vscode 自定義c++標頭檔案,編譯過程中遇到的問題VSCodeC++編譯
- c++模板類的使用,編譯的問題C++編譯
- QT creator 中c和c++混編問題QTC++
- C++和MATLAB混編的問題集錦C++Matlab
- Laravel6.18.0 NPM 編譯時遇到的問題LaravelNPM編譯
- lombok編譯遇到“找不到符號的問題”Lombok編譯符號
- 如何分析和提高(C/C++)程式的編譯速度?C++編譯
- C++ 編譯過程C++編譯
- 編譯 TensorFlow 的 C/C++ 介面編譯C++
- xmake v2.6.1 釋出,使用 Lua5.4 執行時,Rust 和 C++ 混合編譯支援RustC++編譯
- C++編譯器優化C++編譯優化
- C++物件模型:編譯分析C++物件模型編譯
- 安裝c, c++編譯器 on AIXC++編譯AI
- 配置pycharm 編譯器時遇到的一些問題PyCharm編譯
- GCC編譯遇到“a label can only be part of a statement and a declaration is not a statement”問題GC編譯
- 【底層】 C++和C#的編譯方式差異 / AOT和JITC++C#編譯
- C++跨平臺庫boost和Poco的編譯C++編譯
- Linux下C語言編譯的問題LinuxC語言編譯
- 我遇到的小白問題
- 在C,C++,java和python執行時直譯器和編譯器的區別C++JavaPython編譯
- 交叉編譯c++給android呼叫編譯C++Android
- protobuf 的交叉編譯使用(C++)編譯C++
- Ubuntu中用VScode編譯除錯C\C++UbuntuVSCode編譯除錯C++
- 一個nvcc編譯的小問題編譯
- 編譯Android14遇到lunch不顯示target的問題編譯Android
- Linux C++ 開發2 - 編寫、編譯、執行第一個程式LinuxC++編譯
- libmemcached編譯問題IBM編譯
- SPI編譯問題編譯
- 一文搞懂C/C++常用編譯器C++編譯
- 遇到的編碼問題、時區問題整理
- Ubuntu16.04編譯VIORB過程中遇到的問題 尤其是rosbag的問題Ubuntu編譯ORBROS
- gcc 和 g++ 的聯絡和區別,使用 gcc 編譯 c++GC編譯C++
- 【問題記錄】—.NetCore 編譯問題NetCore編譯
- 【ROS教程】用CLion編譯和除錯ROS包的全流程及可能遇到的問題ROS編譯除錯
- 班級問題(c++)C++
- c++ 常見問題C++
- C++的0.3問題C++