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

时间:2009-06-15 21:12:15

标签: c++

参见主题。他们在想什么?

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

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

const int var_a = 1;
int var_b = 1;

...并使用g++ -c test.cpp进行编译只导出var_b

7 个答案:

答案 0 :(得分:99)

我相信你的意思

  

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

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

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

  

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

     

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

答案 1 :(得分:10)

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

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

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

答案 2 :(得分:6)

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

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

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

答案 3 :(得分:5)

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

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

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

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

答案 4 :(得分:3)

这些概念是正交的,不应该被视为同一件事。

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

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

答案 5 :(得分:-2)

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

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

litb给出了最佳答案。

答案 6 :(得分:-4)

没有。写下以下内容:

const int i = 0;

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