Объявление Статической Переменной (C)


Эквивалентны ли следующие два объявления переменных static?

1.

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

2.

    static int var1, var2, var3;
Более конкретно, в случае 2 все переменные будут static, или только var1?
4 7

4 ответа:

Да декларации в случае 1 и 2 идентичны. Мы можем увидеть это, перейдя в раздел Проект стандарта C99 6.7.5 Деклараторы , которые говорят (Курсив мой вперед):

Каждый Декларатор объявляет один идентификатор и утверждает, что когда операнд той же формы, что и Декларатор, появляется в выражении, он обозначает функцию или Объект с областью действия, длительностью хранения, и тип, указанный в декларации спецификаторы .

Мы можем видеть грамматику из раздела 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

Они эквивалентны.

В случае 2 все переменные будут статическими.

Спецификатор класса хранения static применяется ко всем объявленным переменным в объявлении.

Вы только что показали, как переменные могут быть объявлены по-разному.

 static int var1, var2, var3;

Или

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

Имеет то же значение

Ie; переменная одного и того же типа данных(а также одного и того же класса хранения) может быть объявлена отдельно или все вместе один раз

static int var1, var2, var3;

Эквивалентно:

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

Случай 1 или случай 2 оба используются для удобства чтения, но смысл один и тот же.