如果你想要一个全局变量;可从多个编译单元(C++ 文件)访问的单个结构:
/* foo.h */
#ifndef EXAMPLE_FOO_H
#define EXAMPLE_FOO_H
struct foo {
int a;
int b;
};
extern struct foo globalFoo;
#endif /* EXAMPLE_FOO_H */
--
/* foo.cpp */
#include "foo.h"
struct foo globalFoo = { 1, 2 };
--
/* bar1.cpp */
#include "foo.h"
int test1()
{
int c = globalFoo.b; //c is 2
}
--
/* bar2.cpp */
#include "foo.h"
int test2()
{
int x = globalFoo.a; //x is 1
}
foo.h 中的“struct {}”行告诉编译器 struct foo 的样子。“extern struct”行声明了一个名为“globalFoo”的特定struct foo,带有外部链接。(可以将这两个声明结合起来,请参阅@litb 的回答。)这意味着 globalFoo(bar1/test1 和 bar2/test2)的用户将在其他地方寻找结构,他们不会有自己的单独副本。
foo.cpp 是定义 globalFoo 的特例。任何变量只能有一个定义,在这种情况下 foo.cpp 有 globalFoo 的定义。当 bar1 和 bar2 “外部”查找 globalFoo 时,它们会找到 foo.cpp 的 globalFoo。该名称将在所有三个文件中引用相同的实际结构。
如果extern
不存在,那么所有三个 .cpp 文件都会有一行显示“struct foo globalFoo;” (请记住,#include 只是复制/粘贴)这将 [尝试] 创建三个具有相同名称的不同结构,从而导致混乱。
注意: " extern struct foo globalFoo;
" 行在 foo.cpp 的情况下是多余的,但这并不重要。