2011-09-20 29 views
5

Hầu hết những nơi tôi đã thấy các giá trị mã trở lại được thực hiện như thế này,giá trị mã Return trong một hệ thống nhúng viết bằng C

cho sự thành công tình trạng Đổi lại, #define SUCCESS 0 và khác không zero số cho tất cả khác trường hợp lỗi.

Câu hỏi của tôi là, tại sao chúng tôi chọn không cho trường hợp THÀNH CÔNG? Có bất kỳ mối quan tâm cụ thể nào về lập trình cụ thể cho điều đó không?

/R

+1

Lý do lịch sử. Lần cuối cùng điều này xuất hiện không ai có câu trả lời dứt khoát: http://stackoverflow.com/q/329950/184998 –

+0

Câu trả lời thứ hai và thứ tư trong liên kết trên thực sự tốt. –

Trả lời

4

Đây là một C thói quen cũ để trở về 0 cho sự thành công và một số mã khác cho các lỗi, vì vậy bạn có thể nói:

int error = do_stuff(); 
if (error) { 
    handle_error(error); 
} 

Tuy nhiên, các vị từ thường làm việc theo cách khác xung quanh, trở về 1 cho "thành công" (hoặc true từ <stdbool.h>).

+0

Đây là một quy ước OS. Nó không liên quan gì đến C. –

+1

@Let_Me_Be: điều đó phụ thuộc vào việc OP có đề cập đến mã trả về chương trình hay hàm hay không. Nếu đây là một vấn đề hệ điều hành, sau đó thay vì xác định 'SUCCESS', lập trình viên đã sử dụng' EXIT_SUCCESS' từ stdlib. –

+0

Ồ, bạn có thể đúng. –

2

Đây là quy ước của hệ điều hành.

http://en.wikipedia.org/wiki/Exit_status

+0

nhờ mẹo –

+1

Mô tả mã thoát của chương trình, chứ không phải lý do tại sao nó phổ biến (và hợp lý) 0 để cho biết thành công. – nos

+1

Nó không chỉ được sử dụng trong trạng thái thoát của chương trình. Nói chung '0' có nghĩa là thành công khi bạn muốn sử dụng mã trả về không chỉ như một chỉ báo thành công/thất bại, mà còn là một mã lỗi. Sau đó, bạn có thể dễ dàng phân biệt hai trường hợp có hoặc không có lỗi. –

3

Zero thường có nghĩa là thành công vì 0 là giá trị nguyên duy nhất đánh giá sai. Tất cả các giá trị số nguyên khác được đánh giá là đúng và chúng có nghĩa là cho các mã lỗi khác nhau.

Nó có vẻ hơi kỳ quặc và ngược lại, nhưng vì thành công chỉ là thành công và sai sót có thể khác, nên quy ước trên được chọn thường xuyên.

Thực tế, đây là quy ước hợp lý nhất nếu giá trị trả về của một hàm được sử dụng không chỉ như một chỉ báo thành công/thất bại, mà còn là một mã lỗi. Nếu mã lỗi được lưu trữ, hãy nói trong một tham số đầu ra bổ sung, sau đó trả lại 1 để thành công và 0 cho sự thất bại có ý nghĩa hơn.

Hãy tưởng tượng những gì tình trạng này sẽ là trong trường hợp của 0 là thành công:

if (errcode = func()) { 
    /* error handling */ 
} 

so với cồng kềnh hơn:

if ((errcode = func()) != 1) { 
    /* error handling */ 
} 
3

Bạn phải differenciate giữa các lỗi khác nhau, có thể có MaxInt - 1 khác nhau những người.

Nếu 0 là lỗi và 1 là thành công, làm cách nào bạn có thể cho biết sự khác biệt giữa tất cả các lỗi?

+0

nếu Zero là trường hợp lỗi sau đó tôi sẽ sử dụng một nếu để kiểm tra các trường hợp lỗi –

+0

Nhưng làm thế nào bạn có thể phân biệt loại lỗi xảy ra, nếu 0 là điều duy nhất chỉ ra một lỗi? Thường thì bạn muốn biết thêm sau đó "một lỗi xảy ra" Bạn muốn biết cụ thể những gì không thành công. Bạn sẽ phải thiết lập một biến toàn cầu cho mã lỗi cuối cùng của một hàm, hoặc truyền lỗi cho người gọi thông qua con trỏ trong danh sách đối số hàm. Cả hai đều cồng kềnh so với chỉ trả lại mã lỗi – nos

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