const static or static const or what?

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]

Comments (0)

› No comments yet.