const和全球

T.J*_*.J. 1 c++ const global-variables extern

此代码将在c ++中产生错误

// Foo.cpp
const int Foo = 99;

// Main.cpp
extern const int Foo;
int main()
{
    cout << Foo << endl;
    return 0;
}    
Run Code Online (Sandbox Code Playgroud)

许多人给出的原因是全局const具有内部范围,它是默认的静态.

对此的解决方案是: -

    //Foo.h
    extern const int Foo; 

    // Foo.cpp
    #include "Foo.h"
    const int Foo = 99; 

    // Main.cpp
    #include "Foo.h"
    int main()
    {
       cout << Foo << endl;
    }
Run Code Online (Sandbox Code Playgroud)

我以前认为extern用于告诉编译器,indentifer的内存已经分配到其他文件中.
在上面的代码中应用相同的逻辑可以解释这里发生的事情或者extern在c ++中有不同的含义吗?
在这里输入链接描述
还要考虑这个页面它破坏了我的所有直觉..

Alo*_*ave 7

如果我们必须声明一个全局常量(不是static),该怎么办?如何extern在这样的帮助?

const使用extern限定符声明的对象具有外部链接.
因此,如果要const跨多个翻译单元使用,请extern为其添加限定符.

虽然默认情况下全局变量具有外部链接,但为什么const全局默认具有内部链接?

参考:
C++ 03标准附录C兼容性C.1.2第3节:基本概念

更改:显式声明为const且未显式声明为extern的文件范围名称具有内部链接,而在C中则具有外部链接

基本原理:因为const对象可以在C++中用作编译时值,所以这个特性促使程序员为每个const提供显式的初始化值.此功能允许用户将const对象放在许多编译单元中包含的头文件中.


遵循一个简单的规则避免混淆:

默认情况下,Linkage对于非const符号是外部的,对于const符号是static(内部).