【发布时间】:2009-06-15 21:12:15
【问题描述】:
见主题。他们在想什么?
更新:从“静态”更改为“内部链接”以避免混淆。
举个例子...将以下内容放入文件中:
const int var_a = 1;
int var_b = 1;
...使用g++ -c test.cpp 编译时只导出var_b。
【问题讨论】:
标签: c++
见主题。他们在想什么?
更新:从“静态”更改为“内部链接”以避免混淆。
举个例子...将以下内容放入文件中:
const int var_a = 1;
int var_b = 1;
...使用g++ -c test.cpp 编译时只导出var_b。
【问题讨论】:
标签: c++
我相信你的意思
为什么 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 关键字告诉编译器不允许变量作为任何表达式的左值出现 - 实质上是使其只读。
在 C 中,static 关键字有多种用途,具体取决于它的应用。当应用于函数的变量时,它表明该变量不存储在函数的本地范围内,但可以通过调用它来访问。当应用于全局变量或函数时,它只能被特定文件访问 - 换句话说,它只能在编译单元内访问(除非声明为 extern)。
在 C++ 中,static 关键字可以在类定义中使用,以使变量或函数在类的所有实例之间共享,而不是每个实例的本地。此外,C++ 中的静态类函数只能访问该类(或它有权访问的类)的静态变量。现在,在 C++ 中,const 确实为成员提供了与编译单元的内部链接,除非它们被明确声明为 extern - 这可能就是您所指的。这允许通过使用头文件跨单元共享编译时常量。但请记住,成员并不是真正静态的 - 而是将常量编译到每个引用它的位置。
【讨论】:
在 C 和 C++ 中,术语静态有多种含义(它可以控制链接和存储) 您必须阅读 Stroustrup 的 D&E 才能了解他的基本原理 - 但是当您在命名空间范围内将变量声明为 const 时,它会自动具有内部链接 - 而在 C 中您必须将其声明为静态以强制它具有内部链接。
当然在 C++ 中,使用静态来控制链接已被弃用,匿名命名空间可用于模拟 C++ 中的内部链接。
C++ 中的 const 变量应该替换预处理器常量 - 由于预处理器常量只在定义它们的文件中可见,类似地,const 自动使变量只在定义它的文件中可见。
【讨论】:
这些概念是正交的,不应被视为同一事物。
常量是一种访问权限:它只告诉你的变量是只读的(常量)还是写读的(非常量)。
Staticity 是一个生命周期(从技术上讲是内存本地化)属性:它告诉变量在类的范围内是全局的(当在类中时)还是翻译单元(当与定义的全局变量一起使用时)一个cpp)。
【讨论】:
它没有,最明显的例子是,如果你有一个 const 成员变量(当然,它是由构造函数初始化的),它不是由该类的所有对象共享,而是由每个对象共享。
class A {
public:
A(int newx) : x(newx);
private
int x;
}
litb 在上面给出了最好的答案。
【讨论】:
它没有。编写以下内容:
const int i = 0;
不会使 i 成为静态(在 C 或 C++ 中)。
【讨论】: