c++全局变量extern

打印 上一主题 下一主题

主题 886|帖子 886|积分 2658

extern

extern 是 C++ 中的一个关键字,用于声明一个变量或函数是在其他文件中定义的。它的作用是告诉编译器在链接时在其他文件中寻找该变量或函数的定义。
在 C++ 中,如果一个变量或函数在多个文件中使用,那么就需要在每个文件中都声明一次该变量或函数。这时就可以使用 extern 关键字来声明该变量或函数是在其他文件中定义的。
除了在不同文件中共享变量和函数的定义、在函数中使用全局变量、在头文件中声明变量和函数、在类中声明静态成员变量外,extern 还有一些其他的用法:

  • 在模板中使用外部变量
  • 在命名空间中使用外部变量
  • 在静态库中使用外部变量
声明变量

例如,假设我们有两个文件 a.cpp 和 b.cpp,它们都需要使用同一个全局变量 g_var,那么可以在 a.cpp 中定义该变量,并在 b.cpp 中使用 extern 来声明该变量:
  1. // a.cpp
  2. int g_var = 0;
  3. // b.cpp
  4. extern int g_var;
  5. int main() {
  6.     // 使用全局变量 g_var
  7.     g_var = 1;
  8.     return 0;
  9. }
复制代码
在上面的代码中,我们在 a.cpp 中定义了全局变量 g_var,并在 b.cpp 中使用 extern 来声明该变量。这样在链接时,编译器就会在其他文件中寻找该变量的定义。
声明函数

除了变量,extern 关键字也可以用于声明函数。例如,假设我们有两个文件 a.cpp 和 b.cpp,它们都需要使用同一个函数 foo(),那么可以在 a.cpp 中定义该函数,并在 b.cpp 中使用 extern 来声明该函数:
  1. // a.cpp
  2. void foo() {
  3.     // 函数实现
  4. }
  5. // b.cpp
  6. extern void foo();
  7. int main() {
  8.     // 调用函数 foo()
  9.     foo();
  10.     return 0;
  11. }
复制代码
在上面的代码中,我们在 a.cpp 中定义了函数 foo(),并在 b.cpp 中使用 extern 来声明该函数。这样在链接时,编译器就会在其他文件中寻找该函数的定义。
在类中声明静态成员变量

在 C++ 中,如果一个类有静态成员变量,那么需要在类的定义外部进行定义。如果该静态成员变量是在其他文件中定义的,那么可以使用 extern 来声明它。例如:
  1. // a.cpp
  2. class MyClass {
  3. public:
  4.     static int s_var;
  5. };
  6. int MyClass::s_var = 0;
  7. // b.cpp
  8. class MyClass;
  9. extern int MyClass::s_var;
  10. void foo() {
  11.     // 使用静态成员变量 s_var
  12.     MyClass::s_var++;
  13. }
复制代码
在上面的代码中,我们在 a.cpp 中定义了类 MyClass,并在类的定义外部定义了静态成员变量 s_var。在 b.cpp 中,我们使用 extern 来声明静态成员变量 s_var 是在其他文件中定义的。在函数 foo() 中,我们可以直接使用静态成员变量 s_var。
在静态库中使用外部变量

在 C++ 中,如果在静态库中使用一个外部变量,那么可以使用 extern 来声明该变量是在其他文件中定义的。例如:
  1. // a.cpp
  2. int g_var = 0;
  3. // b.cpp
  4. void foo() {
  5.     // 使用外部变量 g_var
  6.     extern int g_var;
  7.     g_var++;
  8. }
  9. // libmylib.a
  10. ar rcs libmylib.a a.o b.o
复制代码
在上面的代码中,我们在 a.cpp 中定义了全局变量 g_var,在 b.cpp 中使用 extern 来声明该变量是在其他文件中定义的。然后将 a.o 和 b.o 打包成静态库 libmylib.a。在其他程序中使用该静态库时,就可以直接使用外部变量 g_var。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表