C++ 中的名稱改編和 extern “C”
在 C++ 中,我們可以使用函式過載功能。使用此功能,我們可以建立具有相同名稱的函式。唯一的區別是引數的型別和引數的數量。這裡不考慮返回型別。現在問題來了,C++ 如何在目的碼中區分過載函式?
在目的碼中,它透過新增有關引數的資訊來更改名稱。這裡應用的技術稱為名稱改編。C++ 沒有標準化的名稱改編技術。因此,不同的編譯器使用不同的技術。
這是一個名稱改編的示例。過載函式被命名為 func(),並且還有一個函式 my_function()。
示例
int func(int x) {
return x*x;
}
double func(double x) {
return x*x;
}
void my_function(void) {
int x = func(2); //integer
double y = func(2.58); //double
}一些 C++ 編譯器會將其更改如下:
示例
int __func_i(int x) {
return x*x;
}
double __func_d(double x) {
return x*x;
}
void __my_function_v(void) {
int x = __func_i(2); //integer
double y = __func_d(2.58); //double
}C 不支援函式過載,因此我們必須確保在將 C 程式碼連結到 C++ 時符號的名稱不會更改。以下 C++ 程式碼將生成錯誤。
示例
int printf(const char *format,...);
main() {
printf("Hello World");
}輸出
undefined reference to `printf(char const*, ...)' ld returned 1 exit status
此問題是由於編譯器更改了 printf() 的名稱而產生的。並且它找不到更新的 printf() 函式的定義。為了克服此問題,我們必須在 C++ 中使用 extern “C”。當某些程式碼在此塊內使用時,C++ 編譯器確保函式名稱未被改編。因此,名稱不會更改。因此,上述程式碼將如下所示以解決此問題。
示例
extern "C" {
int printf(const char *format,...);
}
main() {
printf("Hello World");
}輸出
Hello World
注意:這些程式碼塊在不同的編譯器中可能會產生不同的結果。
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP