【问题标题】:What is the difference between static const and const?静态常量和常量有什么区别?
【发布时间】:2012-10-22 13:15:38
【问题描述】:

static constconst 有什么区别? 例如:

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

它们之间有什么区别吗? 您什么时候会使用其中一个?

【问题讨论】:

  • 投票重新开放。 “重复”提出了一个完全不同的问题,特定于内存使用情况。这个问题提出了一个关于差异的更一般的问题。
  • 我想你是在不明白static的意思的时候问这个问题的。所以,this 的解释可能会有所帮助。

标签: c static constants


【解决方案1】:

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

const 表示初始化后您不会更改该值。

函数内的static表示该变量在函数执行前后都存在。

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

从技术上讲(如果您想查看的话),static 是一个存储说明符,const 是一个类型限定符。

【讨论】:

    【解决方案2】:

    区别在于链接。

    // 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++ 不是同一种语言。特别是Cconst与C++const无关。
    • 编译器真的是基于静态优化的吗?假设静态对象不在其翻译单元之外使用似乎是不安全的,因为它仍然可以由非静态函数传递或由非静态全局指针指向。
    【解决方案3】:

    这取决于这些定义是否在函数内部。上面的 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 这并不愚蠢。在foo 的情况下,每次调用my_function() 时都会重新初始化变量,从而分配不同的随机值。在bar 的情况下,变量只初始化一次,第一次调用my_function() 会导致在程序的生命周期内分配相同的值。因此静态存储持续时间。
    • 实际上,进一步思考,这取决于我们使用的是 C 还是 C++。问题标记为 C,在这种情况下,由于 rand() 不是编译时常量,我们会收到分配 bar 的编译错误。
    • @nibot 能否根据存储规范和类型限定说明“效果不同”和“真正恒定”的含义?
    【解决方案4】:
    const int i=5;  
    

    i 值,如果 i 在本地定义和声明,您可以使用指针修改, 如果全局为static 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;
    } 
    

    【讨论】:

      猜你喜欢
      • 2011-05-27
      • 2011-01-14
      • 2019-03-16
      • 2016-08-24
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      相关资源
      最近更新 更多