在c++程式中呼叫被C編譯器編譯後的函式,為什麼要使用extern “C”
c/c++函式呼叫約定:c/c++函式呼叫約定
一、原題:
二、詳細說明:
現在,在一個工程中;有一個test.c檔案;一個test1.cpp檔案;
//test.c
#include<stdio.h>
int Add(int a,int b)
{
return a+b;
}
(1)使用extern int Add(int,int);
宣告外部函式—–錯誤
//test1.cpp
#include<iostream>
using namespace std;
extern int Add(int,int);//宣告外部test.c中的函式
int main()
{
cout<<Add(50,50)<<endl;
return 0;
}
執行結果:錯誤
錯誤:1>test.obj : error LNK2019: 無法解析的外部符號 “int __cdecl Add(int,int)” (?Add@@YAHHH@Z),該符號在函式 _main 中被引用
解釋:
c語言程式和c++程式在編譯時,是相互獨立的編譯;在.c檔案中,編譯器將Add函式重新命名為_Add; 而在.cpp檔案中,編譯器將用extern宣告的函式重新命名為(?Add@@YAHHH@Z);那麼在連結階段,在_mian函式中該Add函式被呼叫;
此時編譯器帶著(?Add@@YAHHH@Z)函式名進入test.c檔案的編譯檔案中去尋找(?Add@@YAHHH@Z)函式,但是在test.c檔案中這個Add函式被編譯器重新命名為_Add,由於在.cpp檔案中和.c檔案中同一個函式名被編譯器重新命名後的名字不一樣;所以.cpp檔案宣告的外部函式找不到真正定義的地方;程式錯誤;
(2)使用extern "C" int Add(int,int);
外部函式—-正確
#include<iostream>
using namespace std;
extern "C" int Add(int,int);
int main()
{
cout<<Add(50,50)<<endl;
return 0;
}
解釋:
c++語言為了支援過載,對編譯時函式的重新命名規則進行更改,
使用extern “C” 的方式在c++程式中宣告c語言檔案中的函式,可以在編譯時,告訴編譯器使用C語言的規則對該函式的的函式名的進行重新命名,這樣在連結的時候,就可以順利在.c檔案中找到該函式;
相關文章
- 呼叫Visual Studio的cl.exe編譯C/C++程式編譯C++
- 交叉編譯c++給android呼叫編譯C++Android
- 在Linux上使用vscode編譯除錯C/C++程式碼LinuxVSCode編譯除錯C++
- C++編譯器優化C++編譯優化
- 安裝c, c++編譯器 on AIXC++編譯AI
- protobuf 的交叉編譯使用(C++)編譯C++
- 編譯 TensorFlow 的 C/C++ 介面編譯C++
- AndroidStudio使用NDK編譯C/C++程式碼使用原生庫Android編譯C++
- C程式碼在編譯的時候,有時候有些函式會被最佳化掉,直接把函式程式碼編譯進呼叫函式里,那在函式宣告前加入“__attribute__((noinline))”C程式編譯函式inline
- 在C,C++,java和python執行時直譯器和編譯器的區別C++JavaPython編譯
- C++ 編譯過程C++編譯
- 如何分析和提高(C/C++)程式的編譯速度?C++編譯
- 將C++編譯為Flash可用的swcC++編譯
- 一文搞懂C/C++常用編譯器C++編譯
- C++編譯器認為的指標型別(靜態聯編)C++編譯指標型別
- extern "C"的用途—在C++程式碼中嵌入C程式碼C++C程式
- C++物件模型:編譯分析C++物件模型編譯
- c++模板類的使用,編譯的問題C++編譯
- 編譯原理——C++版桌面計算器編譯原理C++
- 在windows上配置vs code編譯除錯c/c++Windows編譯除錯C++
- VS設定 LLVM-Clang 編譯器進行編譯C++專案LVM編譯C++
- Ubuntu中用VScode編譯除錯C\C++UbuntuVSCode編譯除錯C++
- c#程式反編譯C#編譯
- C++ 反彙編:關於函式呼叫約定C++函式
- C++中函式呼叫的用法C++函式
- 編譯warp,d語言寫的c/c++前處理器.編譯C++
- 【C++】使用VS2022開發可以線上遠端編譯部署的C++程式C++編譯
- 編寫可移植C/C++程式的要點C++
- .Net7 CLR的呼叫函式和編譯函式函式編譯
- 為什麼編譯原理被稱為龍書?編譯原理
- 都有Python了,還要什麼編譯器!Python編譯
- [譯]在CUDA C/C++中使用共享儲存器C++
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- C編譯: 使用gdb除錯編譯除錯
- Windows10 VS2017 C++編譯Linux程式WindowsC++編譯Linux
- 如何把C/C++程式編譯成Python模組-超實用C++編譯Python
- [譯]在CUDA C/C++中如何衡量程式碼效能C++
- Linux C++ 開發2 - 編寫、編譯、執行第一個程式LinuxC++編譯
- C++ 的函式分檔案編寫C++函式