【问题标题】:Static Variable Declaration (C)静态变量声明 (C)
【发布时间】:2014-07-09 16:19:50
【问题描述】:

以下两个static 变量声明是否等效?

1.

    static int var1;
    static int var2;
    static int var3;

2.

    static int var1, var2, var3;

更具体地说,在情况 2 中,所有变量都是 static,还是只是 var1

【问题讨论】:

    标签: c declaration language-lawyer static-variables


    【解决方案1】:

    它们是等价的。

    在情况 2 中,所有变量都是静态的。

    存储类说明符static适用于声明中所有声明的变量。

    【讨论】:

      【解决方案2】:

      是的,12 的声明是相同的。我们可以通过转到 draft C99 standard 部分 6.7.5 Declarators 看到这一点(强调我的未来):

      每个声明器声明一个标识符,并断言当一个 与声明符形式相同的操作数出现在表达式中, 它指定一个函数或对象具有范围、存储持续时间、 和声明说明符指示的类型

      我们可以从6.7部分看到语法如下:声明如下:

      declaration:
         declaration-specifiers init-declarator-listopt ;
      

      声明说明符包括存储期限:

      declaration-specifiers:
         storage-class-specifier declaration-specifiersopt
      

      因此存储持续时间说明符适用于 init-declarator-list 中的所有 声明符,其语法如下:

      init-declarator-list:
         init-declarator
         init-declarator-list , init-declarator
      init-declarator:
         declarator
         declarator = initializer
      

      您可能想知道指针,它们的处理方式不同,我们可以从 6.7.5 的语法中看到这一点,用于 声明符

      declarator:
          pointeropt direct-declarator
      [...]
      pointer:
          * type-qualifier-listopt
          * type-qualifier-listopt pointer
      

      【讨论】:

      • 更多信息:这个和const int a, b, c;之间的区别在于static(连同externtypedefautoregister)是一个存储类说明符,而const(以及volatilerestrict)是限定符。说明符的语法规则与限定符的语法规则不同。
      • “说明符的语法规则与限定符的语法规则不同。”那么static volatile int a, b, c; 怎么样。 abc 最终会不会一样?
      【解决方案3】:

      您刚刚展示了如何以不同方式声明变量。

       static int var1, var2, var3;
      

      static int var1;
      static int var2;
      static int var3;
      

      意思相同

      即;相同数据类型(以及相同存储类)的变量可以单独声明一次,也可以一起声明一次

      【讨论】:

        【解决方案4】:
        static int var1, var2, var3;
        

        相当于:

        static int var1;
        static int var2;
        static int var3;
        

        case 1 或 case 2 都用于可读性目的,但含义相同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-14
          • 1970-01-01
          相关资源
          最近更新 更多