2010-06-30 32 views
29

Tôi đang cố gắng biên dịch cùng một tệp C trên hai máy khác nhau với các phiên bản khác nhau của cc.tuyên bố tĩnh sau khai báo không tĩnh

gcc phiên bản 3.2.3 nói warning: 'foo' was declared implicitly 'extern' and later 'static'

gcc phiên bản 4.1.2 nói error: static declaration of 'foo' follows non-static declaration

AFAICT, cả hai đều có CFLAGS cùng. Tôi muốn làm cho gcc 4.1.2 hoạt động như gcc 3.2.3, nghĩa là tìm một tùy chọn có thể biến lỗi này thành một cảnh báo đơn giản.

Trả lời

26

Từ thông báo lỗi than phiền, có vẻ như bạn nên cố gắng sửa mã nguồn. Trình biên dịch phàn nàn về sự khác biệt trong khai báo, tương tự như ví dụ

void foo(int i); 
... 
void foo(double d) { 
    ... 
} 

và đây không phải là mã C hợp lệ, do đó trình biên dịch phàn nàn.

Có thể vấn đề của bạn là không có nguyên mẫu có sẵn khi hàm được sử dụng lần đầu tiên và trình biên dịch ngầm tạo ra một hàm sẽ không tĩnh. Nếu vậy giải pháp là thêm một mẫu thử nghiệm ở đâu đó trước khi nó được sử dụng lần đầu tiên.

+1

Thực tế mã không thử nghiệm hàm, vì vậy gcc giả định một khai báo ngầm tiềm ẩn. Câu trả lời đúng là không có tùy chọn để tắt lỗi này. – Alsciende

+0

Bạn có thể biến các khai báo ngầm thành các lỗi với '-Werror-implicit-function-declare' (dưới gcc 3.4, anyway; không chắc chắn về các phiên bản sau này). – detly

+0

Tôi đã làm, nhưng lỗi vẫn còn sống! pastebin.com/2mpnyMPj –

4

Hãy thử -Wno-traditional.

Nhưng tốt hơn, thêm tờ khai cho các chức năng tĩnh của bạn:

static void foo (void); 

// ... somewhere in code 
    foo(); 

static void foo() 
{ 
    // do sth 
} 
+7

'-Không truyền thống 'không hoạt động. – Alsciende

+0

Tôi đã làm, nhưng lỗi vẫn còn sống! http://pastebin.com/2mpnyMPj –

4

Trong khi 3.2.3 gcc đã tha thứ nhiều hơn về vấn đề này, gcc 4.1.2 được làm nổi bật một vấn đề nghiêm trọng đối với việc liên kết của chương trình của bạn sau này . Thay vào đó, sau đó cố gắng để ngăn chặn các lỗi bạn nên làm cho tờ khai chuyển tiếp phù hợp với tuyên bố chức năng.

Nếu bạn dự định cho chức năng có sẵn trên toàn cầu (theo khai báo chuyển tiếp) thì sau đó không khai báo nó là tĩnh. Tương tự như vậy nếu nó được thụt vào trong phạm vi cục bộ thì hãy đưa ra tuyên bố chuyển tiếp tĩnh để khớp.

0

Bạn đã khai báo hàm không tĩnh trong một số tệp và bạn đã triển khai tĩnh trong tệp khác hoặc ở đâu đó có cùng một tệp có thể gây ra sự cố này. Ví dụ: mã sau sẽ tạo ra lỗi này.

void inlet_update_my_ratio(object_t *myobject); 
//some where the implementation is like this 
static void inlet_update_my_ratio(object_t *myobject) { 
//code 
} 

Nếu bạn xóa tĩnh khỏi quá trình triển khai, lỗi sẽ biến mất như sau.

void inlet_update_my_ratio(object_t *myobject) { 
    //code 
    } 
Các vấn đề liên quan