为什么const暗示C ++中的内部链接,当它不在C中?

见主题。 他们在想什么?

更新:从“静态”更改为“内部链接”,以避免混淆。

给一个例子…把下面的文件放在一个文件中:

const int var_a = 1; int var_b = 1; 

…并用g++ -c test.cpp编译g++ -c test.cpp只导出var_b

我相信你的意思

为什么const暗含了C ++中的内部连接

确实,如果你在名字空间范围声明一个const对象,那么它有内部的连接。

附录C给出了理由

更改:显式声明为const的文件作用域的名称,没有明确声明为extern,具有内部链接,而在C中,它将具有外部链接

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

正如litb所说,const对象有内部的联系。 这是因为他们打算这样使用:

 // a.cpp const int BUFSIZE = 100; char abuf[BUFSIZE]; // b.cpp const int BUFSIZE = 256 int bbuf[BUFSIZE]; 

在C&C ++中,术语static有多种含义(可以pipe理链接和存储)。你必须阅读Stroustrup的D&E来理解他的基本原理 – 但是当你在命名空间范围声明一个variables为const时,它自动具有内部链接。在C中,你必须声明它是静态的,强制它有内部的联系。

当然在C ++中,使用静态来控制链接已经被废弃了,匿名的名字空间可以用来模拟C ++中的内部链接。

C ++中的constvariables被认为可以代替预处理器常量 – 而且由于预处理器常量只能在定义它们的文件中可见,类似地,const自动使variables只在定义它的文件中可见。

Const和static是C和C ++中的正交概念。

const关键字告诉编译器禁止variables作为任何expression式的左值出现 – 本质上是只读的。

在C中, static关键字有几个用途,取决于它应用于什么。 当应用于函数的variables时,表示该variables不存储在函数的本地范围中,而是可以通过它的调用进行访问。 当应用于全局variables或函数时,它只能被一个特定的文件访问 – 换句话说,它只能在编译单元中访问(除非声明为extern )。

在C ++中,可以在类定义中使用static关键字,以便在类的所有实例之间共享variables或函数,而不是在每个实例中都是本地的。 而且,C ++中的静态类函数只能访问该类(或者它可以访问的类)的静态variables。 现在,在C ++中, const赋予成员内部链接到编译单元,除非它们被明确声明为extern – 这可能是你所指的。 这允许通过使用头文件在单元之间共享编译时常量。 但请记住,成员并不是真正的静态 – 而是常量被编译到每个被引用的位置。

这些概念是正交的 ,不应该被认为是一回事。

Constness是一个访问权限:它只会告诉你的variables是只读的(const)还是write-read(非const)的。

静态是一种生存时间(和技术上的内存本地化)属性:它告诉variables是否在类的范围内(当在类中)或翻译单元(当与在cpp中定义的全局variables一起使用时)是全局的, 。

它没有,最明显的例子是,如果你有一个const成员variables(当然是由构造函数初始化的),它不被该类的所有对象共享,而是每个对象都是共享的。

 class A { public: A(int newx) : x(newx); private int x; } 

上面给出了最好的答案。

它不。 写下以下内容:

 const int i = 0; 

不使i静态(在C或C + +)。