为什么const意味着C ++中的内部链接,当它不在C中时?

问题描述 投票:72回答:7

见主题。他们在想什么?

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

举个例子......把以下内容放在一个文件中:

const int var_a = 1;
int var_b = 1;

...并与g++ -c test.cpp编译只出口var_b

c++
7个回答
101
投票

我相信你的意思

为什么const意味着C ++中的内部链接

确实,如果在命名空间范围内声明一个const对象,那么它就具有内部链接。

附录C(C ++ 11,C.1.2)给出了基本原理

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

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


11
投票

正如litb所说,const对象具有内部联系。这是因为它们的用途如下:

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

// b.cpp
const int BUFSIZE = 256
int bbuf[BUFSIZE];

6
投票

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

当然在C ++中,不推荐使用静态控制链接,匿名命名空间可用于模拟C ++中的内部链接。

C ++中的const变量应该替换预处理器常量 - 并且由于预处理器常量仅在定义它们的文件中可见,类似地,const自动使变量仅在定义它的文件中可见。


5
投票

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

const关键字告诉编译器禁止变量作为任何表达式的左值出现 - 实质上使其成为只读。

在C中,static关键字有几种用途,具体取决于它的应用范围。当应用于函数的变量时,它表示该变量不存储在函数的本地范围内,但可以在其调用之间访问。当应用于全局变量或函数时,它只能被特定文件访问 - 换句话说,它只能在编译单元中访问(除非声明为extern)。

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


3
投票

这些概念是正交的,不应该被认为是同一个东西。

Constness是一种访问权限:它只告诉您的变量应该是只读(const)还是写入读取(非const)。

静态是一个生命周期(和技术上的内存本地化)属性:它告诉变量是否在类的范围内(在类中时)或转换单元(当与cpp中定义的全局变量一起使用时)是全局的。


-2
投票

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

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

litb给出了最好的答案,上面。


-4
投票

它没有。写下以下内容:

const int i = 0;

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

© www.soinside.com 2019 - 2024. All rights reserved.