2012-10-17 34 views
10

Tôi có một số chương trình C mà không cần bất kỳ sự trở lại rõ ràng từ chính, như thế này:GCC mặc định giá trị trả về chính không phải là zero

int main(int argc, char *argv[]) 
{ 
    // blah blah 
} 

Nếu tôi biên dịch chúng với GCC 4.6.3 và các tùy chọn sau:

gcc file.c -Wall -Wextra 

Chương Trình không trả lại 0 và đưa cho tôi vấn đề, nhưng tiêu chuẩn (và rất nhiều câu trả lời khác về SO) nói:

Nếu kiểu trả về của hàm main là kiểu tương thích với int, một sự trả về từ lệnh gọi ban đầu đến hàm main tương đương với việc gọi hàm exit với giá trị được trả về bởi hàm main làm đối số của nó; [10] đạt} kết thúc chức năng chính trả về giá trị 0. Nếu kiểu trả về không tương thích với int, trạng thái kết thúc trả về môi trường máy chủ không được chỉ định.

[10] Theo 6.2.4, thời gian tồn tại của các đối tượng có thời lượng lưu trữ tự động được khai báo trong chính sẽ kết thúc trong trường hợp trước, ngay cả khi chúng không có trong trường hợp sau.

Chương trình của tôi trả về các giá trị khác nhau, 160, 15, 14 ... rác?

Tôi có thiếu gì đó không? Đây có phải là lỗi của GCC không? Không thể tìm thấy bất kỳ thứ gì trong tài liệu trực tuyến của GCC. GCC vẫn đề cập đến một số tiêu chuẩn C cũ (pre-C99) mà điều này có thể không được chỉ định?

+3

biên dịch bằng '-std = c99'. –

+0

Tôi sẽ cố gắng, cảm ơn. – effeffe

+0

@BlueMoon: Tốt hơn, hãy thêm 'return 0;' vào cuối 'main'. Nó vô hại trong chế độ C99. –

Trả lời

13

Theo mặc định gcc-std=gnu89 là phần mở rộng C90 + GNU.

Và C90 nói:

(C90, 5.1.2.2.3) "Nếu chức năng chính thực hiện một sự trở lại mà xác định không có giá trị, tình trạng chấm dứt trở lại môi trường máy chủ là undefined"

Biên dịch với -std=c99 hoặc -std=gnu99 để có giá trị trả lại là 0 khi trả về bị bỏ qua trong chức năng chính.

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