2012-01-26 10 views
5

Oggi mi sono imbattuto in un codice che mi ha sorpreso. Una variabile è stata definita (al di fuori di una funzione) nel file .c come statica. Tuttavia, nel file .h è stato dichiarato esternamente. Ecco un simile esempio del codice:Nessun avviso o indicazione di errore quando la variabile definita come statica ma dichiarata come extern

definizioni Struttura e dichiarazione in .h:

typedef struct 
{ 
    unsigned char counter; 
    unsigned char some_num; 
} One_Struct; 

typedef struct 
{ 
    unsigned char counter; 
    unsigned char some_num; 
    const unsigned char * p_something; 
} Another_Struct; 

typedef struct 
{ 
    One_Struct * const p_one_struct; 
    Another_Struct * const p_another_struct; 
} One_Useful_Struct; 

extern One_Useful_Struct * const p_my_useful_struct[]; 

Definizione e inizializzazione in .c:

static One_Useful_Struct * const p_my_useful_struct[MAX_USEFUL_STRUCTS] = 
{ 
    &p_my_useful_struct_regarding_x, 
    &p_my_useful_struct_regarding_y, 
}; 

Domanda: Quindi la mia domanda è: perché non ho ricevuto un errore o un avvertimento del compilatore?

Il codice è stato eseguito con successo in altri progetti da qualche tempo. Ho notato che il puntatore non viene mai usato al di fuori del file .c in cui è definito ed è stato definito correttamente come statico (ho rimosso la dichiarazione esterna). L'unica ragione per cui l'ho trovato è perché ho lanciato Lint sul progetto e Lint l'ha raccolto.

risposta

6

Non è certianly di serie C. GCC e clangore sia rivelazione e un errore in questo caso:

$ gcc example.c 
example.c:4: error: static declaration of ‘x’ follows non-static declaration 
example.c:3: error: previous declaration of ‘x’ was here 
$ clang example.c 
example.c:4:12: error: static declaration of 'x' follows non-static declaration 
static int x; 
     ^
example.c:3:12: note: previous definition is here 
extern int x; 
     ^
1 error generated. 

È necessario utilizzare un compilatore abbastanza permissiva - forse Visual Studio? Ho appena controllato la mia macchina Windows e VS2003 accetta silenziosamente il mio programma di esempio. L'aggiunta di /Wall dà un avvertimento:

> cl /nologo /Wall example.c 
example.c 
example.c(4) : warning C4211: nonstandard extension used : redefined extern to static 

mi sembra si sta utilizzando un'estensione di qualsiasi compilatore è che si sta utilizzando.

+0

Questo è un buon punto, dovrò cercare in che estensioni sono in atto. Sto usando Keil uVision per ARM. –

+0

Non ci sono estensioni dispari sul posto. Deve essere qualcosa con questo compilatore. Grazie per il tuo contributo, lo apprezzo. –

Problemi correlati