在啊:
#ifndef A_h
#define A_h
#include "string"
extern std::string a;
#endif
在 A.cpp 中,在全局范围内:
#include "A.h"
std::string a = "a";
在啊:
#ifndef A_h
#define A_h
#include "string"
extern std::string a;
#endif
在 A.cpp 中,在全局范围内:
#include "A.h"
std::string a = "a";
您没有重新定义变量,因为您的代码只有一个定义 - CPP 文件中的那个。标题中的一个是声明,因为它使用extern
关键字。CPP 文件为标头中声明的变量提供定义。
可以这样想:编译器看到 A.cpp 一次,而且只有一次。如果您的项目有许多#included Ah 的源文件,编译器会看到 Ah 多次,每个 #include 一次,因为它处理所有 *.cpp 文件。在这种情况下,有一个定义和多个声明是合乎逻辑的
你所拥有的是正确的 - A.cpp 中全局范围内的变量。作为全局和非静态的,它有可能在其他地方使用。事实上,如果它不在其他地方使用,它会污染命名空间。