簡體   English   中英

為什么這些全局變量具有名稱空間范圍?

[英]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.cpp1 因此,鏈接器可以在globals.cpp找到該符號。


1)請注意,您甚至可以提供定義extern const double pi = 3.14; 直接在頭文件中,但不建議這樣做,因為將頭包含在多個翻譯單元中將導致符號重復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM