[英]Why are these global variables when they have namespace scope?
在以下代碼中, 這將調用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
pi
從globals.h命名空間中的前向聲明中檢索標識符pi
?
這個問題是我 在這里 問的先前問題的延續 。
全局大致意味着可以從每個翻譯單元訪問,而不管變量是否在名稱空間中。 最好的示例是std::cout
,它是在namespace std
定義的全局變量,它表示std::basic_ostream<>
的實例。
關於第二個問題,因為您包含標頭globals.h
,所以可以訪問Constants::pi
該標頭聲明了extern const double Constants::pi;
。 該聲明指示編譯器該變量具有外部鏈接,您有責任在某個.cpp
文件中定義它(您在globals.cpp
) 1 。 因此,鏈接器可以在globals.cpp
找到該符號。
1)請注意,您甚至可以提供定義extern const double pi = 3.14;
直接在頭文件中,但不建議這樣做,因為將頭包含在多個翻譯單元中將導致符號重復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.