在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檔案中找到該函式;
相關文章
- 為什麼C++編譯器不能支援對模板的分離式編譯 (轉)C++編譯
- C++編譯器優化C++編譯優化
- 安裝c, c++編譯器 on AIXC++編譯AI
- 交叉編譯c++給android呼叫編譯C++Android
- [C++]函式與編譯預處理(一)C++函式編譯
- [C++]函式與編譯預處理(二)C++函式編譯
- 編譯C++ 程式的過程編譯C++
- protobuf 的交叉編譯使用(C++)編譯C++
- 呼叫Visual Studio的cl.exe編譯C/C++程式編譯C++
- FreeBSD中的GNU C編譯器--編譯器GCC(轉)編譯GC
- 使用makefile編譯c程式編譯C程式
- C++程式中不同函式呼叫方式的彙編碼比較C++函式
- CMM編譯器和C編譯器過程呼叫實現的比較編譯
- 為什麼要學習編譯器課程?編譯
- 使用C編譯器編寫shellcode編譯
- C/C++—— C++編譯器是如何實現多型C++編譯多型
- windows 下c++編譯WindowsC++編譯
- C++ 編譯過程C++編譯
- 編譯 TensorFlow 的 C/C++ 介面編譯C++
- 將C++編譯為Flash可用的swcC++編譯
- 一文搞懂C/C++常用編譯器C++編譯
- C程式碼在編譯的時候,有時候有些函式會被最佳化掉,直接把函式程式碼編譯進呼叫函式里,那在函式宣告前加入“__attribute__((noinline))”C程式編譯函式inline
- java 和c++在編譯和執行上有什麼區別?JavaC++編譯
- C++編譯器認為的指標型別(靜態聯編)C++編譯指標型別
- 如何分析和提高(C/C++)程式的編譯速度?C++編譯
- 在C,C++,java和python執行時直譯器和編譯器的區別C++JavaPython編譯
- 為什麼 "auto a = 1;" 在C語言中可以編譯通過?C語言編譯
- 在Linux上使用vscode編譯除錯C/C++程式碼LinuxVSCode編譯除錯C++
- 如何加快C++程式碼的編譯速度C++編譯
- AndroidStudio使用NDK編譯C/C++程式碼使用原生庫Android編譯C++
- C++中extern的使用C++
- extern "C"的用途—在C++程式碼中嵌入C程式碼C++C程式
- C/C++編譯過程詳解C++編譯
- java開發C語言編譯器:為C語言提供API呼叫JavaC語言編譯API
- C++物件模型:編譯分析C++物件模型編譯
- 優化C++程式碼(2):C++程式碼的編譯過程優化C++編譯
- c++模板類的使用,編譯的問題C++編譯
- 編譯原理——C++版桌面計算器編譯原理C++