extern extern 是 C++ 中的一個關鍵字,用於聲明一個變數或函數是在其他文件中定義的。它的作用是告訴編譯器在鏈接時在其他文件中尋找該變數或函數的定義。 在 C++ 中,如果一個變數或函數在多個文件中使用,那麼就需要在每個文件中都聲明一次該變數或函數。這時就可以使用 extern 關鍵字 ...
extern
extern
是 C++ 中的一個關鍵字,用於聲明一個變數或函數是在其他文件中定義的。它的作用是告訴編譯器在鏈接時在其他文件中尋找該變數或函數的定義。
在 C++ 中,如果一個變數或函數在多個文件中使用,那麼就需要在每個文件中都聲明一次該變數或函數。這時就可以使用 extern
關鍵字來聲明該變數或函數是在其他文件中定義的。
除了在不同文件中共用變數和函數的定義、在函數中使用全局變數、在頭文件中聲明變數和函數、在類中聲明靜態成員變數外,extern
還有一些其他的用法:
- 在模板中使用外部變數
- 在命名空間中使用外部變數
- 在靜態庫中使用外部變數
聲明變數
例如,假設我們有兩個文件 a.cpp
和 b.cpp
,它們都需要使用同一個全局變數 g_var
,那麼可以在 a.cpp
中定義該變數,併在 b.cpp
中使用 extern
來聲明該變數:
// a.cpp
int g_var = 0;
// b.cpp
extern int g_var;
int main() {
// 使用全局變數 g_var
g_var = 1;
return 0;
}
在上面的代碼中,我們在 a.cpp
中定義了全局變數 g_var
,併在 b.cpp
中使用 extern
來聲明該變數。這樣在鏈接時,編譯器就會在其他文件中尋找該變數的定義。
聲明函數
除了變數,extern
關鍵字也可以用於聲明函數。例如,假設我們有兩個文件 a.cpp
和 b.cpp
,它們都需要使用同一個函數 foo()
,那麼可以在 a.cpp
中定義該函數,併在 b.cpp
中使用 extern
來聲明該函數:
// a.cpp
void foo() {
// 函數實現
}
// b.cpp
extern void foo();
int main() {
// 調用函數 foo()
foo();
return 0;
}
在上面的代碼中,我們在 a.cpp
中定義了函數 foo()
,併在 b.cpp
中使用 extern
來聲明該函數。這樣在鏈接時,編譯器就會在其他文件中尋找該函數的定義。
在類中聲明靜態成員變數
在 C++ 中,如果一個類有靜態成員變數,那麼需要在類的定義外部進行定義。如果該靜態成員變數是在其他文件中定義的,那麼可以使用 extern
來聲明它。例如:
// a.cpp
class MyClass {
public:
static int s_var;
};
int MyClass::s_var = 0;
// b.cpp
class MyClass;
extern int MyClass::s_var;
void foo() {
// 使用靜態成員變數 s_var
MyClass::s_var++;
}
在上面的代碼中,我們在 a.cpp
中定義了類 MyClass
,併在類的定義外部定義了靜態成員變數 s_var
。在 b.cpp
中,我們使用 extern
來聲明靜態成員變數 s_var
是在其他文件中定義的。在函數 foo()
中,我們可以直接使用靜態成員變數 s_var
。
在靜態庫中使用外部變數
在 C++ 中,如果在靜態庫中使用一個外部變數,那麼可以使用 extern
來聲明該變數是在其他文件中定義的。例如:
// a.cpp
int g_var = 0;
// b.cpp
void foo() {
// 使用外部變數 g_var
extern int g_var;
g_var++;
}
// libmylib.a
ar rcs libmylib.a a.o b.o
在上面的代碼中,我們在 a.cpp
中定義了全局變數 g_var
,在 b.cpp
中使用 extern
來聲明該變數是在其他文件中定義的。然後將 a.o
和 b.o
打包成靜態庫 libmylib.a
。在其他程式中使用該靜態庫時,就可以直接使用外部變數 g_var
。