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)
và return 0
từ main()
hành xử theo cách tương tự như exit(EXIT_SUCCESS)
và 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) { ... }
Nguồn
2009-12-04 00:33:13
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 ;-) –
Bạn là hacker đúng, cảm ơn vì đã chỉ ra nó. – MRFerocius