C++中的extern
關鍵字和跨語言互操作
變量的聲明與定義
extern
關鍵字用于聲明在另一個翻譯單元(文件)中定義的變量或函數。通過extern
關鍵字,可以在多個文件中訪問全局變量或函數。
變量聲明示例
文件:main.cpp
#include <iostream>// 聲明外部變量
extern int globalVariable;int main() {std::cout << "全局變量: " << globalVariable << std::endl;return 0;
}
文件:global.cpp
// 定義外部變量
int globalVariable = 42;
函數聲明示例
文件:main.cpp
#include <iostream>// 聲明外部函數
extern void printMessage();int main() {printMessage();return 0;
}
文件:functions.cpp
#include <iostream>// 定義外部函數
void printMessage() {std::cout << "來自另一個文件的消息!" << std::endl;
}
編譯
要編譯并鏈接這些文件,可以使用如下命令:
g++ main.cpp global.cpp functions.cpp -o myProgram
extern "C"
來與 C 代碼進行互操作
extern "C"
關鍵字在 C++ 中用于指示編譯器以 C 語言的方式來處理聲明的函數或變量,從而實現 C 和 C++ 代碼的互操作。
C 代碼部分
文件:example.c
#include <stdio.h>// 這是一個 C 函數
void hello_from_c() {printf("Hello from C!\n");
}// 這是一個接受兩個整數并返回它們和的 C 函數
int add(int a, int b) {return a + b;
}
C++ 代碼部分
文件:main.cpp
#include <iostream>// 使用 extern "C" 來聲明 C 函數
extern "C" {void hello_from_c();int add(int a, int b);
}int main() {// 調用 C 函數hello_from_c();// 調用 C 的加法函數int result = add(3, 4);std::cout << "The result of add(3, 4) is: " << result << std::endl;return 0;
}
編譯和運行
要編譯和運行這個程序,需要執行以下步驟:
-
首先編譯 C 文件:
gcc -c example.c -o example.o
-
然后編譯 C++ 文件并鏈接 C 文件:
g++ main.cpp example.o -o main
-
最后運行生成的可執行文件:
./main
執行后,應該會看到以下輸出:
Hello from C!
The result of add(3, 4) is: 7
與 C 代碼共享全局變量
C++ 代碼可以訪問 C 代碼中定義的全局變量,反之亦然。
C 代碼
文件:example.c
int shared_variable = 10;void print_shared_variable() {printf("Shared variable: %d\n", shared_variable);
}
C++ 代碼
文件:main.cpp
#include <iostream>extern "C" {extern int shared_variable;void print_shared_variable();
}int main() {std::cout << "Shared variable in C++: " << shared_variable << std::endl;print_shared_variable();return 0;
}
與 C 庫的互操作
通過extern "C"
,可以在 C++ 中使用用 C 編寫的庫。
C 庫頭文件
文件:mylib.h
#ifndef MYLIB_H
#define MYLIB_Hvoid c_function();#endif
C 庫實現
文件:mylib.c
#include "mylib.h"
#include <stdio.h>void c_function() {printf("Function from C library\n");
}
C++ 代碼
文件:main.cpp
#include <iostream>extern "C" {#include "mylib.h"
}int main() {c_function();return 0;
}
抑制編譯器對未使用參數的警告
為了避免編譯器對未使用參數發出警告,可以使用如下方法:
void func(int signal) {(void)signal; // 忽略未使用的參數warning
}
這一行是一種顯式標記signal
參數為未使用的方式,從而抑制編譯器的警告。