为什么这些全局变量具有命名空间范围?
Why are these global variables when they have namespace scope?
在下面的代码中,this 正在调用 globals.cpp 命名空间中的变量 实际全局变量 .
globals.h
#ifndef GLOBALS_H_
#define GLOBALS_H_
namespace Constants
{
// forward declarations only
extern const double pi;
extern const double avogadro;
extern const double my_gravity;
}
#endif
globals.cpp
namespace Constants
{
// actual global variables
extern const double pi(3.14159);
extern const double avogadro(6.0221413e23);
extern const double my_gravity(9.2); // m/s^2 -- gravity is light on this planet
}
source.cpp
#include <iostream>
#include <limits>
#include "globals.h"
int main()
{
double value_of_pi = Constants::pi;
std::cout << value_of_pi;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin.get();
return 0;
}
我知道extern
用于访问其他翻译单元中的全局变量。我可能对此读得太多了,但是为什么 globals.cpp 命名空间中的变量在具有命名空间范围时被认为是全局的?此外,我是否可以假设 Constants::pi
从 globals.h 命名空间的前向声明中检索标识符 pi
?
这个问题是我之前问过的一个问题的延续 。
全局大致意味着可以从每个翻译单元访问,无论变量是否在命名空间中。最好的例子是std::cout
,它是在namespace std
中定义的一个全局变量,代表了std::basic_ostream<>
.
的实例化。
关于你的第二个问题,Constants::pi
是可以访问的,因为你包含了 header globals.h
,它声明了 extern const double Constants::pi;
。此声明指示编译器该变量具有外部链接,并且您有责任在某些 .cpp
文件中定义它(您在 globals.cpp
)1).所以链接器能够在 globals.cpp
中找到符号,仅此而已。
1) 请注意,您甚至可以直接在 header 文件中提供定义 extern const double pi = 3.14;
,但不建议这样做,因为将 header 包含在多个翻译单元将导致重复的符号。
在下面的代码中,this 正在调用 globals.cpp 命名空间中的变量 实际全局变量 .
globals.h
#ifndef GLOBALS_H_
#define GLOBALS_H_
namespace Constants
{
// forward declarations only
extern const double pi;
extern const double avogadro;
extern const double my_gravity;
}
#endif
globals.cpp
namespace Constants
{
// actual global variables
extern const double pi(3.14159);
extern const double avogadro(6.0221413e23);
extern const double my_gravity(9.2); // m/s^2 -- gravity is light on this planet
}
source.cpp
#include <iostream>
#include <limits>
#include "globals.h"
int main()
{
double value_of_pi = Constants::pi;
std::cout << value_of_pi;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin.get();
return 0;
}
我知道extern
用于访问其他翻译单元中的全局变量。我可能对此读得太多了,但是为什么 globals.cpp 命名空间中的变量在具有命名空间范围时被认为是全局的?此外,我是否可以假设 Constants::pi
从 globals.h 命名空间的前向声明中检索标识符 pi
?
这个问题是我之前问过的一个问题的延续
全局大致意味着可以从每个翻译单元访问,无论变量是否在命名空间中。最好的例子是std::cout
,它是在namespace std
中定义的一个全局变量,代表了std::basic_ostream<>
.
关于你的第二个问题,Constants::pi
是可以访问的,因为你包含了 header globals.h
,它声明了 extern const double Constants::pi;
。此声明指示编译器该变量具有外部链接,并且您有责任在某些 .cpp
文件中定义它(您在 globals.cpp
)1).所以链接器能够在 globals.cpp
中找到符号,仅此而已。
1) 请注意,您甚至可以直接在 header 文件中提供定义 extern const double pi = 3.14;
,但不建议这样做,因为将 header 包含在多个翻译单元将导致重复的符号。