在同一头文件中定义外部变量

Defining an extern variable in the same header file

我想知道是否可以在同一个头文件中同时声明和定义外部变量。我需要跨多个文件引用变量,虽然我意识到有更好的方法来实现这一点,但在这种情况下使用 extern 是唯一的选择。那么是否可以这样做:

// in main.h
extern int foo;
int foo;

etc...

然后任何包含 main.h 的文件都可以访问 foo?许多示例都提到了在单独的 cpp 文件中定义外部变量,但我只是想知道我建议的方式是否会在项目的其余部分引起问题。

真正的定义(不是 extern)不应该在头文件中。

如果你想从不同的cpp中获得一个全局变量,你应该做两件事:在一个cpp中定义,在h中声明extern。

例如:

// global.h
extern int foo;

// global.cpp
int foo;

然后在任何需要 foo 的文件中:

#include "global.h"

当然,global.cpp 必须是项目的一部分(与其他文件一起编译)

如果将一个定义放在一个头文件中,当涉及多个源文件时,您最终会得到多个定义。

例如,假设 main.cother.c 都包含 foo.h。当您编译这些文件中的每一个时,您将得到 main.oother.o,它们都具有 int foo 的定义。如果您随后尝试将 link main.oother.o 放入单个可执行文件中,您将收到一个 linker 错误,指出 int foo 被定义了两次。

要正确执行此操作,您 将头文件中的变量声明为 extern int foo。然后,在一个(而且只有一个)源文件中,您 定义 带有 int foo.

的变量

只有当没有多个文件定义同一个变量时,您所做的事情在 C++ 中是完全合法的。

The variable or function may be defined in another source file, or later in the same file. Declarations of variables and functions at file scope are external by default.

通常我们 extern 在其他文件中声明的全局变量。

这与初始化为 0 的全局变量一样好。