2009-12-03 27 views
6

Tôi biết EXIT_SUCCESS/EXIT_FAILURE thường được sử dụng cho lối ra chính() để cho biết tính thành công của một chương trình.Cách tiếp cận phổ biến cho các giá trị trả về hàm có ý nghĩa là gì?

Nhưng nó cũng được sử dụng (thường hoặc được đề xuất) để trả về hàm bình thường? Tôi đang cố gắng viết một số mã "chuẩn" để tự hỏi liệu tôi có nên sử dụng chúng thay vì 0 hoặc -1 ..

Trả lời

0

EXIT_SUCCESS là một constant.- simbolic

Bạn có thể sử dụng EXIT_SUCCESSEXIT_FAILURE cũng như 0 cho OK và phi 0 cho thất bại.

Phụ thuộc vào hương vị, bạn cũng có thể làm cho điều này

#define WRONG 1 
#define COOL 0 

và trở those.-

Sử dụng bất cứ điều gì bạn cảm thấy thoải mái hơn với, nhưng giữ cho lựa chọn của bạn tất cả các cách.

Hy vọng điều này sẽ hữu ích!

+1

Tôi khuyên bạn nên xóa dấu chấm phẩy khỏi định nghĩa của mình ;-) –

+1

Bạn là hacker đúng, cảm ơn vì đã chỉ ra nó. – MRFerocius

0

Tôi muốn nói điều đó không quan trọng.

+0

Tôi biết rằng bài viết này sẽ đến. Rõ ràng, nó không quan trọng đối với một số ;-) –

+0

Xem câu trả lời của Jerry –

+0

Đó là bản chất nghi ngờ, nhưng ngay cả điều đó cũng không xứng đáng, tôi tin. –

1

Nếu bạn đang sử dụng mã lỗi, hãy sử dụng cùng một hằng số để thành công mà thư viện của bạn sử dụng sẽ giúp mọi việc rõ ràng hơn.

3

Nhiều chức năng được xác định bởi tiêu chuẩn trả về POSIX 0 cho thành công hoặc mã lỗi khác 0 để chỉ báo lỗi.

Rất nhiều hàm POSIX được xác định để trả về 0 cho thành công, -1 cho lỗi và đặt biến toàn cầu errno để chỉ ra những gì không thành công. Nhưng một errno doesn't work well toàn cầu trong một chương trình đa luồng.

+7

afaik nhất (phổ biến) triển khai 'errno' là an toàn luồng - tiêu chuẩn C cho phép' errno' được thực thi như một macro để làm cho điều này có thể là – Christoph

+0

trong Ngoài những gì Christoph nói, nhiều kết hợp trình biên dịch/HĐH sẽ cho phép bạn chú thích các biến như tồn tại trong lưu trữ cục bộ. do đó, toàn cầu không phải lúc nào cũng là vấn đề ngay cả khi không có macro. – asveikau

4

Bạn không bao giờ nên sử dụng EXIT_SUCCESS hoặc EXIT_FAILURE bên ngoài ngữ cảnh cuộc gọi đến exit() hoặc giá trị trả về là main(). Các giá trị của các số nguyên này không được chỉ định theo tiêu chuẩn, do đó bạn không thể viết mã di động nếu bạn cho rằng chúng là 0 hoặc 1 tương ứng.

Các tiêu chuẩn nào xác định rằng exit(0)return 0 từ main() hành xử theo cách tương tự như exit(EXIT_SUCCESS)return EXIT_SUCCESS, nhưng những giá trị này là "đặc biệt" ở chỗ chúng cần phải được hiểu một cách thực hiện xác định. Nghĩa là, giá trị thực được truyền cho hệ thống có thể không bằng 0, và giá trị không đổi của EXIT_SUCCESS là miễn phí không phải là 0 nếu yêu cầu thực hiện, miễn là return 0 từ chính và return EXIT_SUCCESS từ chính hoạt động theo cùng một cách.

Nếu bạn sử dụng các giá trị này trong các chức năng của mình, người gọi của bạn sẽ phải so sánh trực tiếp với số EXIT_SUCCESS để xác định xem chức năng có thành công hay không.

int MyFunction1() { /* ... */ return EXIT_SUCCESS; } 
int MyFunction2() { /* ... */ return 0; } 

// Portable: 
if (MyFunction1() == EXIT_SUCCESS) { ... } 
if (MyFunction2() == 0) { ... } 
if (!MyFunction2()) { ... } 

// Not portable: 
if (MyFunction1() == 0) { ... } 
if (!MyFunction1()) { ... } 
if (MyFunction2() == EXIT_SUCCESS) { ... } 

Vấn đề trở nên rõ ràng hơn với EXIT_FAILURE:

int MyFunction1() { /*... */ return EXIT_FAILURE; } 
// Not portable 
if (MyFunction1()) { ... } 
if (MyFunction1() == 1) { ... } 
// The only way to make this portable. 
if (MyFunction1() == EXIT_FAILURE) { ... } 
+0

@Bạn nhận xét của bạn có vẻ mâu thuẫn với tôi: bạn đề nghị không bao giờ sử dụng macro EXIT bên ngoài ngữ cảnh thoát hoặc chính, và sau đó hiển thị mã nơi EXIT macro một di động hơn. – Figo

+0

Cảm ơn nhận xét, tôi sẽ làm rõ. –

0

tôi không sử dụng các EXIT_ * macro cho các chức năng vì:

  • Một số chức năng của tôi cần phải trả lại một ký errno on failure
  • Một số chức năng của tôi cần trả lại số byte được đọc hoặc viết
  • .210
  • tôi thích để xử lý lỗi với một callback function pointer gõ
  • Tôi thích vẫn còn phù hợp

Bây giờ, chúng ta đến với main():

  • POSIX Says bạn có thể thoát ra với một giá trị 0 - 255. Rất, rất hữu ích để trả lại trạng thái thoát có ý nghĩa thay vì chỉ thành công hay thất bại. Điều này giúp làm cho kịch bản thông minh hơn. Về vấn đề này, chỉ EXIT_SUCCESS là hữu ích.
13

Không sử dụng EXIT_SUCCESS hoặc EXIT_FAILURE cho các chức năng hoặc cho bất kỳ điều gì khác ngoài yêu cầu exit.

Hãy thoải mái, tuy nhiên, để xác định các loại của riêng bạn cho các chức năng của bạn để trả lại, nhưng điều đó tùy thuộc vào tình huống và mã chính xác mà bạn đang viết.

Một số phương pháp phổ biến là:

  • Chức năng quay trở lại con trỏ hầu như luôn luôn trả về NULL (đó là 0 theo ANSI C, nhưng NULL là một tên mô tả hơn để sử dụng) trong trường hợp lỗi
  • Chức năng đó chỉ số trả về hoặc vị trí thường trả về -1 do lỗi (vì nó không thể là chỉ mục thực, trong khi 0 có thể, vì vậy 0 không phải là giá trị trả về lỗi tốt)
  • Trong trường hợp phức tạp hơn, bạn có thể thấy nó hữu ích xác định loại trả về mới với số enum, một trong số đó là lỗi của bạn và kiểm tra điều đó.

Miễn là bạn nhất quán, đừng bỏ trốn khỏi các quy ước quá xa và ghi lại mọi thứ, bạn nên OK.

+0

+1 để cung cấp giải pháp thay thế được giải thích tốt –

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