2012-01-26 10 views
5

Bugün beni şaşırtan bazı kodlara rastladım. .c dosyasındaki bir değişken (bir işlevin dışında) statik olarak tanımlandı. Ancak, .h dosyasında extern olarak ilan edildi. .cDeğişken olarak tanımlanmış, ancak extern olarak tanımlandığında uyarı veya hata göstergesi yok

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[]; 

Tanım ve başlatma:

Yapısı tanımlar ve beyan .h:

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

Soru: İşte benzer bir kod örneği Yani benim sorum, neden bir derleyici hatası veya uyarı almadım?

Kod, şu anda başka projelerde başarılı bir şekilde çalışıyor. İşaretçinin tanımlandığı ve düzgün olarak tanımlandığı (dış bildirimi kaldırdığım) .c dosyasının dışında hiçbir zaman kullanılmadığını fark ettim. Onu bulmamın tek nedeni, projede Lint'i çalıştırdığım ve Lint'in onu almasıydı.

cevap

6

O Certianly değil standart C. GCC ve çınlama hem algılayabilir ve bu durumda bir hata vermek: Bir tatlı keyfi derleyici kullanıyor olması gerekir

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

- belki Visual Studio? Sadece Windows makinemi kontrol ettim ve VS2003 örnek programımı sessizce kabul ediyor. Eğer kullandığınız olduğunu ne olursa olsun derleyici bir uzantısını kullanan konum gibi

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

bana görünüyor: /Wall ekleme bir uyarı veriyor.

+0

Bu güzel bir nokta, hangi uzantıların bulunduğuna bakmak zorundayım. ARM için Keil uVision kullanıyorum. –

+0

Yerinde tek bir uzantı yok. Bu derleyici ile bir şey olmalı. Girdiğin için teşekkürler, minnettarım. –

İlgili konular