and complains loudly that this was not legal C code: “static”, he screams, “must come before const”:

1

staticconstcharTEXT[]="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:

1

2

3

4

5

$gcc-c-Wall-Wtest.c

warning:`static'isnotat beginning of declaration

$lint-nt-utest.c

Warning618:Storage classspecified afteratype

(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!

1

charconststaticTEXT[]="Hi there!";

is perfectly legal, but

1

$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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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.