2012-01-26 33 views
5

Tôi đã gặp một số mã ngày hôm nay khiến tôi ngạc nhiên. Một biến được định nghĩa (bên ngoài một hàm) trong tệp .c là tĩnh. Tuy nhiên, trong tập tin .h nó đã được khai báo là extern. Dưới đây là một ví dụ tương tự của mã:Không có cảnh báo hoặc chỉ báo lỗi khi biến được xác định là tĩnh nhưng được khai báo là extern

định nghĩa Cấu trúc và tuyên bố trong .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[]; 

Định nghĩa và khởi tạo trong 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, 
}; 

Câu hỏi: Vì vậy, câu hỏi của tôi là, tại sao tôi không nhận được lỗi biên dịch hoặc cảnh báo?

Mã đã chạy thành công trong các dự án khác một thời gian. Tôi đã lưu ý rằng con trỏ không bao giờ được sử dụng bên ngoài tệp .c, trong đó nó được định nghĩa và được định nghĩa đúng là tĩnh (tôi đã loại bỏ khai báo bên ngoài). Lý do duy nhất tôi tìm thấy đó là vì tôi đã chạy Lint trong dự án và Lint nhặt nó lên.

Trả lời

6

Đó là certianly không đạt tiêu chuẩn C. GCC và kêu vang cả phát hiện và đưa ra một lỗi về trường hợp này:

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

Bạn phải sử dụng một trình biên dịch khá dễ dãi - có lẽ Visual Studio? Tôi chỉ cần kiểm tra trên máy Windows của tôi và VS2003 chấp nhận chương trình ví dụ của tôi âm thầm. Thêm /Wall không cảnh báo:

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

Dường như tôi đang sử dụng phần mở rộng của trình biên dịch bạn đang sử dụng.

+0

Đó là một điểm tốt, tôi sẽ phải xem xét các tiện ích mở rộng được đặt ra. Tôi đang sử dụng KeV uVision cho ARM. –

+0

Không có bất kỳ tiện ích mở rộng lẻ nào. Nó phải chỉ là một cái gì đó với trình biên dịch này. Cảm ơn bạn đã nhập, tôi đánh giá cao nó. –

Các vấn đề liên quan