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.
Questo è un buon punto, dovrò cercare in che estensioni sono in atto. Sto usando Keil uVision per ARM. –
Non ci sono estensioni dispari sul posto. Deve essere qualcosa con questo compilatore. Grazie per il tuo contributo, lo apprezzo. –