What is the difference between static const and const?
static const和const有什么区别?例如:
1 2
| static const int a=5;
const int i=5; |
他们之间有什么区别吗?你什么时候用一个比另一个?
- @"静态是默认行为"当然不是。是什么让你想到这个主意的?
- 相关:stackoverflow.com/questions/6381088/const-vs-static-const
- 投票决定重新开放。"复制"是问一个完全不同的问题,具体到内存使用。这个问题问了一个关于差异的更一般的问题。
静态决定函数外部的可见性或内部变量的寿命。所以这与警察本身无关。
const意味着初始化后不会更改该值。
函数内部的静态意味着变量将在函数结束之前和之后存在。
函数外部的static表示标记为static的符号的范围仅限于该.c文件,并且在该文件外部看不到。
从技术上讲(如果您想查找它),static是一个存储说明符,const是一个类型限定符。
区别在于连杆。
1 2 3
| // At file scope
static const int a=5; // internal linkage
const int i=5; // external linkage |
如果i对象未在定义它的翻译单元之外使用,则应使用static说明符声明它。
这使编译器能够(潜在地)执行进一步的优化,并通知读者对象不在其翻译单元之外使用。
- +1如果您还可以在函数中添加这些声明的含义,那就太好了。
- 您确定const int i = 5;具有外部链接吗?在C++中它不…
- @文件范围内的Kerreksb,是的。(c99,6.2.2p5)"如果对象的标识符声明具有文件范围,并且没有存储类说明符,则其链接是外部的。"
- @ KerrekSB:C和C++不是同一种语言。特别地,C const与C++EDCX1〔1〕无关。
- @Praetorian见stackoverflow.com/a/43859414/462335!
- 编译器真的基于静态优化吗?似乎假设静态对象不在其转换单元之外使用是不安全的,因为它仍然可以由非静态函数传递或由非静态全局指针指向。
这取决于这些定义是否在函数内部。函数之外的情况的答案由ouah给出,见上文。函数内部的效果不同,如下面的示例所示:
1 2 3 4 5 6
| #include <stdlib.h>
void my_function () {
const int foo = rand(); // Perfectly OK!
static const int bar = rand(); // Compile time error.
} |
如果您希望一个局部变量是"真正的常量",那么您不仅要定义它"const",还要定义它"static const"。
- 它非常适合我…但我知道在这种情况下有一个静态常量变量是愚蠢的。