C++允许重新定义全局(const)变量?

bad*_*000 2 c++ global const redeclaration

我对全局常量有点困惑.我(初学者级别)的理解是'全局'变量是在块之外定义的并且具有程序范围(来源:http://www.learncpp.com/cpp-tutorial/42-global-variables/).但该计划:

#include <iostream>

const double x=1.5;

int main(){
        std::cout << "1) x=" << x << std::endl;
        double x=2.5;
        std::cout << "2) x=" << x << std::endl;
        //const double x=3.5;
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用-Wall编译g ++(GCC,最新的64位版本),没有任何问题.

输出:

1) x=1.5
2) x=2.5
Run Code Online (Sandbox Code Playgroud)

这对我来说很困惑.第一个cout评估的事实意味着main将'x'识别为'全局'变量(它未在main的范围中定义).如果是这样的话,为什么让我重新定义'x'?

然后,如果取消注释注释的第三个声明,g ++会引发重新声明错误.意思是,我的第一个宣言不能是'全球',在我定义的意义上:S

编辑:好的,问题与全局变量无关,但是范围:例如http://pastebin.com/raw.php?i=V5xni19M中的相同问题

Rei*_*ica 8

#include <iostream>

const double x=1.5;
Run Code Online (Sandbox Code Playgroud)

在代码的这一点上,有一个x在全局范围内命名的对象,它是类型的const double.

int main(){
        std::cout << "1) x=" << x << std::endl;
Run Code Online (Sandbox Code Playgroud)

此时,仍然只有一个x可见(全局一个),所以这就是名称x所指的内容.

        double x=2.5;
Run Code Online (Sandbox Code Playgroud)

在代码的这一点上,您已经引入了一个命名x为范围的对象main().该范围嵌套在全局范围内,因此现在您有两个名为的对象x:

  1. x 在全球范围内的类型 const double

  2. xmain()类型的范围内double

当地x隐藏全球x.如果要访问全局x内部main(),可以将其称为::x.

    std::cout << "2) x=" << x << std::endl;
    double x=3.5;  //uncommented
Run Code Online (Sandbox Code Playgroud)

不,你试图引入另一个命名x为范围的对象main().这是不可能的,x在那个范围内已经有一个,所以它失败了.