静态const和const有什么区别?


81

static const和之间有什么区别const?例如:

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

它们之间有什么区别吗?您什么时候可以使用另一个?



5
投票重新开放。“重复”是一个完全不同的问题,具体针对内存使用情况。这个问题问一个关于差异的更一般的问题。
rmaddy 2015年

Answers:


56

区别在于链接。

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

如果i未在定义翻译单元的外部使用该对象,则应使用说明static符对其进行声明。

这使编译器能够(潜在地)执行进一步的优化,并告知读者该对象未在其翻译单元之外使用。


8
+1如果您还可以添加这些声明在函数内的含义,那将是很棒的。
Praetorian

您确定const int i = 5;具有外部链接吗?在C ++中,它不是...
Kerrek SB 2012年

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

13
@KerrekSB:C和C ++语言不同。特别地,Cconst与C ++无关const
R .. GitHub停止帮助ICE

编译器真的基于静态优化吗?似乎不安全地假定未在其转换单元之外使用静态对象是不安全的,因为它仍可以通过非静态函数传递出去或由非静态全局指针指向。
nw。

99

static确定函数外部的可见性或内部变量寿命。因此,它const本身与无关。

const 表示您无需在初始化后更改该值。

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

static在函数外部表示被标记符号的范围static仅限于该.c文件,并且无法在该文件之外看到。

从技术上讲(如果要查找),static它是存储说明符,并且const是类型限定符。


0

const int i = 5;
如果我是在本地定义和声明的,并且它是静态const int a = 5,则我可以通过使用指针进行修改;或const int i = 5; 全局而言,您无法修改,因为它存储在数据段的RO存储器中。

    #include <stdio.h>
   //const int  a=10;              /* can not modify */
   int main(void) {
   // your code goes here

   //static const int const a=10;   /* can not modify */
   const int  a=10; 
   int *const ptr=&a;
   *ptr=18;
   printf("The val a is %d",a);
   return 0;
} 

-1

这取决于这些定义是否在函数内部。函数的情况的答案由上面的ouah给出。函数内部,效果不同,如以下示例所示:

#include <stdlib.h>

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

如果要使局部变量“真正恒定”,则不仅要定义“ const”,还要定义“ static const”。


它为我完美编译。但是我知道在这种情况下拥有静态const变量是愚蠢的。
DrumM

1
@DrumM这并不愚蠢。如果foo每次my_function()调用都会重新初始化变量,则会导致分配不同的随机值。在bar变量仅初始化一次的情况下,第一次my_function()调用会导致在程序的生存期内分配相同的值。因此,静态存储持续时间。
jb

1
实际上,经过进一步的思考,这取决于我们使用的是C还是C ++。这个问题标记为C,在这种情况下,bar由于rand()不是编译时常量,因此分配时出现编译错误。
jb

1
@nibot能否参考存储规范和类型限定性来阐明“效果不同”和“真正恒定”的含义?
jb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.