为什么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 + +)。