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