为什么一个const全局变量的多重定义允许在C而不是在C?

由于单一定义规则,不允许在C或C中对全局变量进行多重定义。但是,在C中,const全局变量可以在没有错误的多个编译单元中定义。这与C中的不一样。

为什么C允许这个而C不?为什么一个const全局的用法和行为不同于一个非const全局这样在C相比C? C和C相对于const有什么发生?

例如这是允许在C中,但错误在C:

// Foo.cpp
const int Foo = 99;

// Main.cpp
const int Foo = 99;
int main()
{
    cout << Foo << endl;
    return 0;
}

这是罚款与C,但错了C:

// Foo.cpp
const int Foo = 99;

// Main.cpp
extern const int Foo;
int main()
{
    cout << Foo << endl;
    return 0;
}
// Foo.cpp
const int Foo = 99;

// Main.cpp
const int Foo = 99;

命名空间作用域的const变量具有内部链接。因此,它们基本上是两个不同的变量。没有重新定义。

从@ David的评论,3.5 / 3 [basic.link]:

A name having namespace scope (3.3.5)
has internal linkage if it is the name
of
— an object, reference, function or
function template that is explicitly
declared static or,
— an object or
reference that is explicitly declared
const and neither explicitly declared
extern nor previously declared to have
external linkage
; or
— a data member
of an anonymous union.

在第二种情况下,你应该这样做(正确的方式):

//Foo.h
extern const int Foo; //use extern here to make it have external linkage!

// Foo.cpp
#include "Foo.h"
const int Foo = 99; //actual definition goes here

// Main.cpp
#include "Foo.h"
int main()
{
   cout << Foo << endl;
}
http://stackoverflow.com/questions/6173872/why-is-multiple-definition-of-a-const-global-variable-allowed-in-c-and-not-in

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:为什么一个const全局变量的多重定义允许在C而不是在C?