Posts: 632
Threads: 18
Joined: Jan 2006
Reputation:
1
Code:
1. extern int s=10;
2. static int s;
In the first line "s" is declared with external linkage, whereas in the second line "s" is declared with internal linkage. This is undefined behaviour [ C90: Undef 8, C99: Undef 7 ] and is a violation of rule 1.3
However, if the first two lines are switched
Code:
1. static int s;
2. extern int s=10;
In this case "s" is declared with internal linkage in the first line. In the second line the declaration of "s" is not of external linkage, but instead takes the same linkage as the prior declaration which in this case is internal linkage. [See C99: Section 6.2.2 para 4 ]
Both declarations therefore have internal linkage. This is well-defined in C, but violates rule 8.8. Note: rule 8.8 applies to both definitions and declarations as stated in the Amplification.
Posted by and on behalf of the MISRA C Working Group