This issue crops up time and again: somebody looks at code like this:
const static char TEXT = "Hi there!";
and complains loudly that this was not legal C code: “static”, he screams, “must come before const”:
static const char TEXT = "Hi there!";
I’ve never had a compiler that generated wrong code from the first version. I guess this myth is nourished by the fact that GCC and PC-Lint issue odd warnings when confronted with const-first declarations:
$gcc -c -Wall -W test.c warning: `static' is not at beginning of declaration $lint-nt -u test.c Warning 618: Storage class specified after a type
(PC-Lint’s warning message is particularly weird, isn’t it?)
Both tools process the second version without any complaint.
I really don’t know where this rumor comes from. Maybe it was true in K&R C, but C++98 and C99 certainly don’t care about the order of qualifiers — they don’t even care about the position of the type!
char const static TEXT = "Hi there!";
is perfectly legal, but
$gcc -c -Wall -W -std=c99 test.c
still complains like before (at least when using the -Wall -W combination; -Wall alone doesn’t produce this warning).
The C99 grammar (see 6.7 Declarations) clearly says:
declaration-specifiers: storage-class-specifier declaration-specifiers_opt type-specifier declaration-specifiers_opt type-qualifier declaration-specifiers_opt function-specifier declaration-specifiers_opt storage-class-specifier: typedef extern static auto register type-specifier: void char short int ... type-qualifier: const restrict volatile
so the order obviously doesn’t matter.
Personally, I prefer the first version, because the fact that a variable is a constant is more important to me than its scope. Still, it is probably wiser to use the second version: not because the first one is ill-formed, but because of misbehaving compilers and static analysis tools.
[update 2009-05-20: Christian Hujer found the missing link: chapter 6.11. (“Future Language Directions”) of the ISO C99 standard clearly says:
“The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.”
There you have it. Forget my crazy preferences, write future-proof code by following the standard’s advice. – end update]