2012-11-01 125 views
30

可能重复:
Const vs Static Conststatic const和const有什么区别?

是什么static constconst之间的区别? 例如:

static const int a=5; 
const int i=5; 

它们之间有什么区别吗? 你什么时候使用一个?

+0

@EtiennedeMartel“静态是默认行为”当然不是。无论给你什么想法? –

+2

相关:http://stackoverflow.com/questions/6381088/const-vs-static-const – halex

+2

投票重新开放。 “重复”是问一个完全不同的问题,具体到内存使用情况。这个问题提出了一个关于差异的更一般的问题。 – rmaddy

回答

25

区别在于联动。

// At file scope 
static const int a=5; // internal linkage 
const int i=5;   // external linkage 

如果i对象没有定义它的转换单元之外使用,你应该用static符声明。

这使得编译器能够(可能)执行进一步优化并通知读者该对象不在其翻译单元之外使用。

+3

+1如果你还可以添加它的含义,如果这些声明是在一个函数内,那将会很棒。 – Praetorian

+0

你确定'const int i = 5;'有外部连接吗?在C++中它不... –

+4

@KerrekSB在文件范围,是的。 *(C99,6.2.2p5)“如果对象的标识符的声明具有文件范围并且没有存储类说明符,则其链接是外部的。”* – ouah

40

static决定函数外的可见性或内部的变量生命期。所以它与const本身无关。

const意味着你没有改变初始化后的值。

函数内部的静态意味着变量将在函数结束之前和之后存在。

函数外部的静态意味着标记为静态的符号范围仅限于该.c文件,并且无法在其外部看到。

技术上(如果你想查看这个),static是一个存储说明符,const是一个类型限定符。

+0

简单的解释谢谢! – Alec

0

这取决于这些定义是否在函数内部。 以外的答案函数由上面的ouah给出。 内部函数效果是不同的,通过下面的例子说明:

#include <stdlib.h> 

void my_function() { 
    const int foo = rand();   // Perfectly OK! 
    static const int bar = rand(); // Compile time error. 
} 

如果你想有一个局部变量是“真常,”你必须定义它不仅仅是“常量”,而是“静常量”。

+0

它为我完美编译......但我知道在这种情况下有一个静态常量变量是愚蠢的。 – DrumM

相关问题