2012-01-26 9 views
5

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ł.

Odpowiedz

6

To nie certianly standardowy C. GCC i brzęk zarówno wykryć i dać błąd w tej sprawie:

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

Musisz być przy użyciu dość liberalne kompilatora - może Visual Studio? Właśnie sprawdziłem na moim komputerze z systemem Windows, a VS2003 po cichu akceptuje mój przykładowy program. Dodawanie /Wall daje ostrzeżenie:

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

patrzy na mnie jak używasz rozszerzenie kompilator cokolwiek to jest, że używasz.

+0

To dobra uwaga, będę musiał sprawdzić, jakie są rozszerzenia. Używam Keil uVision dla ARM. –

+0

Nie ma żadnych dziwnych rozszerzeń. To musi być coś z tym kompilatorem. Dzięki za twój wkład, doceniam to. –

Powiązane problemy