2012-02-07 21 views
7

Tôi có một chương trình rất lớn biên dịch với gcc không có cảnh báo.Có cách nào để kích hoạt (int i = 0; ... trong gcc mà không phải bật chế độ c99

Nếu tôi quay về chế độ c99 --std = c99 trên dòng lệnh, nó mang lại một số lượng lớn các cảnh báo và lỗi.

Nhưng tôi yêu thành ngữ for(int i=0; i<20; i++){ code }

ở vị trí của {int i; for (i=0; i<20; i++){ code }}

có cách nào để nói với gcc để cho phép điều này và chỉ này?

Ngoài ra, có cách nào để kích hoạt chế độ c99 trong các chức năng cụ thể mà tôi đang làm việc không? Một cái gì đó như

#pragma c99 on 

for(int i=0; i<99; i++) 
{ 
    code 
} 

#pragma c99 off 
+3

ANSI C cấm hỗn hợp kê khai và báo cáo vì một lý do . Bạn nên khai báo tất cả các biến của bạn ở trên cùng của hàm của bạn và đó là tất cả. Nếu bạn sợ mất chúng hoặc trộn chúng, hàm của bạn có quá nhiều dòng và bạn nên phân đoạn nó. – Eregrith

+2

Điều gì sẽ xảy ra khi bạn thử biên dịch mã của bạn ở chế độ 'gnu99' (trái với' c99')? – NPE

+22

Nhận xét này là viết tắt của "bỏ phiếu chống lại" của Eregrith. Có nhiều lý do tại sao C89 cho phép bạn định nghĩa các biến ở phía trên cùng của khối * bất kỳ *, không chỉ là một hàm chức năng như yêu cầu hướng dẫn kiểu của Eregrith. Ngoài ra còn có những lý do tốt tại sao vài ngôn ngữ khác và rất ít ngôn ngữ hiện đại, có bất kỳ yêu cầu nào như vậy. Không theo phong cách của Eregrith, ngay cả trong C89. Lý do tại sao C89 cấm kết hợp các định nghĩa và các câu lệnh khác là một yếu tố khá yếu - nó phần lớn là lịch sử vào năm 1989, và phải làm với các trình biên dịch cũ đã đặt các khung xếp chồng theo một cách khá đơn giản. –

Trả lời

7

Rất có thể là những lời cảnh báo và lỗi là vì -std=c99 yêu cầu tiêu chuẩn phù hợp với C99, có nghĩa là nhiều chức năng nền tảng cụ thể rằng ô nhiễm không gian tên C99 không được định nghĩa.

Thay vào đó, bạn nên thử --std=gnu99, tương đương C99 với chế độ mặc định là gnu89.

+0

Hoặc tốt hơn, sử dụng '-std = c99' và sau đó xác định macro thử nghiệm tính năng chính xác cho những gì bạn muốn sử dụng (có thể là' -D_XOPEN_SOURCE = 700'). –

2

Ngoài ra để sử dụng -std = gnu99 bạn có thể vô hiệu hóa các cảnh báo cá nhân:

 
-Wno-declaration-after-statement 

đọc info gcc:

 
`-Wdeclaration-after-statement (C and Objective-C only)' 
    Warn when a declaration is found after a statement in a block. 
    This construct, known from C++, was introduced with ISO C99 and is 
    by default allowed in GCC. It is not supported by ISO C90 and was 
    not supported by GCC versions before GCC 3.0. *Note Mixed 
    Declarations::. 
+0

Vấn đề là nó là * lỗi *, không phải là cảnh báo khi bạn ở chế độ c89. –

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