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
。