参见主题。他们在想什么?
更新:从“静态”更改为“内部链接”以节省混乱。
举个例子...将以下内容放入文件中:
const int var_a = 1;
int var_b = 1;
...并且g++ -c test.cpp
仅使用出口进行编译var_b
。
Answers:
我相信你的意思
为什么const暗示C ++中的内部链接
的确,如果在名称空间范围内声明const对象,则它具有内部链接。
附录C(C ++ 11,C.1.2)给出了基本原理
更改:显式声明为const而不显式声明为extern的文件范围的名称具有内部链接,而在C中它将具有外部链接
原理:由于const对象可用作C ++中的编译时值,因此此功能敦促程序员为每个const提供显式的初始化程序值。此功能允许用户将const对象放入许多编译单元中包含的头文件中。
正如litb所说,const
对象在C ++中具有内部链接。这是因为它们打算像这样使用:
// a.cpp
const int BUFSIZE = 100;
char abuf[BUFSIZE];
// b.cpp
const int BUFSIZE = 256
int bbuf[BUFSIZE];
在C和C ++中,const和static是正交的概念。
的const
关键字告诉编译器从呈现为任何表达的左值禁止可变-基本上使它只读的。
在C语言中,static
关键字有多种用途,具体取决于它所应用的对象。当将其应用于函数的变量时,它表示该变量未存储在函数的本地范围内,但可在调用该函数时访问。当应用于全局变量或函数时,它仅可用于特定文件-换句话说,它仅可在编译单元内访问(除非声明extern
)。
在C ++中,static
可以在类定义中使用关键字,以使变量或函数在类的所有实例之间共享,而不是在每个实例中都位于局部。此外,C ++中的静态类函数只能访问该类(或它有权访问的类)的静态变量。现在,在C ++中const
确实为成员提供了到编译单元的内部链接,除非明确声明了它们extern
-这可能就是您所引用的。这允许通过使用头文件在整个单元之间共享编译时常量。但是请记住,成员并不是真正的静态对象-而是将常量编译到引用它的每个位置。