Natknąłem się na dzisiejszy kod, który mnie zaskoczył. Zmienna została zdefiniowana (poza funkcją) w pliku .c jako statyczna. Jednak w pliku .h została zadeklarowana jako zewnętrzna. Tutaj jest podobny przykład kodu:Brak ostrzeżenia lub wskazanie błędu, gdy zmienna zdefiniowana jako statyczna, ale zadeklarowana jako zewnętrzna
definicje Struktura i deklaracja w ncurses.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[];
Definicja i inicjalizacja w .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,
};
Pytanie: Moje pytanie brzmi: dlaczego nie otrzymałem błędu lub ostrzeżenia kompilatora?
Kod od dłuższego czasu działa w innych projektach. Zauważyłem, że wskaźnik nigdy nie jest używany poza plikiem .c, w którym został zdefiniowany i został poprawnie zdefiniowany jako statyczny (usunąłem zewnętrzną deklarację). Jedynym powodem, dla którego go znalazłem, było to, że uruchomiłem Linta w projekcie i Lint go podniósł.
To dobra uwaga, będę musiał sprawdzić, jakie są rozszerzenia. Używam Keil uVision dla ARM. –
Nie ma żadnych dziwnych rozszerzeń. To musi być coś z tym kompilatorem. Dzięki za twój wkład, doceniam to. –