全局变量

  • 存储持续性:静态
  • 链接性:外部:其他文件可以通过extern来引用,且引用时不能初始化。
  • 如果两个文件都有相同的全局变量,会引起符号重定义

    1. // file1.cpp
    2. int a;
    3. // file2.cpp
    4. int a;
    5. # 符号重定义

    全局函数

  • 函数的存储持续性:静态

  • 函数的链接性:外部

static

用于全局变量
  • 存储持续性:静态;
  • 链接性:内部:其他文件无法引用。

    1. // file1.cpp
    2. static int a = 5;
    3. // file2.cpp
    4. extern int a;
    5. # 错误:无法解析的外部符号
  • 可以将static int a;放在头文件中,不会出错

    1. // file1.h
    2. static int a = 4;
    3. # OK

    用于局部变量
  • 存储持续性:静态

  • 申明语句只会在第一次调用时运行,之后会跳过。

    用于类成员变量
  • static类成员变量只能在类中声明,类外初始化。最好不要在头文件初始化,否则可能重定义。

    1. // file1.h
    2. class Test {
    3. public:
    4. static int a;
    5. };
    6. // file1.cpp
    7. #include "file1.h"
    8. int Test::a = 4;
    9. # OK

extern

  • 引用其他文件的全局变量,且不能初始化

    1. // file1.cpp
    2. int a = 3;
    3. // file2.cpp
    4. extern int a;
    5. # OK
  • extern不能单独使用,必须配合其他文件的全局变量一起使用。

    1. // file1.cpp
    2. extern int a;
    3. # 错误:无法解析的外部命令

const

  • const的全局变量是内部链接的,可以放在头文件中而不出问题。
    1. // file1.h
    2. const int a = 4;
    3. # OK

类声明定义

  • 类的函数在类内定义时,应该写在头文件中,不会出错。
  • 类的函数在类外定义时,不应该写在.h文件中,会出现重定义错误。
  • 类的静态函数可以在类内定义,写在头文件中;也可以在类外定义,写在头文件中。
  • 类的静态成员变量,必须在类外定义,不应该写在.h文件中,否则重定义。
  • 全局函数可以包装为类的静态函数,从而通过头文件发布。