Yes the declarations in case 1
and 2
are identical. We can see this by going to the draft C99 standard section 6.7.5
Declarators which says (emphasis mine going forward):
Each declarator declares one identifier, and asserts that when an
operand of the same form as the declarator appears in an expression,
it designates a function or object with the scope, storage duration,
and type indicated by the declaration specifiers.
We can see the grammar from section 6.7
Declarations is as follows:
declaration:
declaration-specifiers init-declarator-listopt ;
the declaration-specifiers include storage duration:
declaration-specifiers:
storage-class-specifier declaration-specifiersopt
so the storage duration specifier applies to all the declarators in the init-declarator-list which has the following grammar:
init-declarator-list:
init-declarator
init-declarator-list , init-declarator
init-declarator:
declarator
declarator = initializer
You may wonder about pointers, they are handled handled differently and we can see this from the grammar in 6.7.5
for declarators:
declarator:
pointeropt direct-declarator
[...]
pointer:
* type-qualifier-listopt
* type-qualifier-listopt pointer