2012-11-10 29 views
21

Tại sao tôi nhận được lỗi này:Sử dụng định danh chưa được khai báo 'true'

infinite.c:5:12: error: use of undeclared identifier 'true' 
    while (true) { 

1 error generated. 
make: *** [infinite] Error 1 

... khi tôi cố gắng để biên dịch mã đơn giản này cho một vòng lặp vô hạn?

#include <stdio.h> 

int main(void) { 
    int x = 0; 
    while (true) { 
     printf("%i\n", x); 
    } 
} 
+1

mm .. sử dụng 'while (1)' –

+1

Thậm chí tốt hơn: 'for (;;)'. Không có điều kiện tầm thường ma thuật. Và rất có thể là bạn có thể thực sự gắn các khai báo cục bộ và điều kiện thoát trong đó. –

Trả lời

16

C không có loại boolean tích hợp. Vì vậy, nó không biết những gì true là. Bạn phải tự mình khai báo theo cách này:

#define TRUE 1 
#define FALSE 0 

[...] 
while (TRUE) { 
    [...] 
} 
+8

C _has_ một kiểu boolean dựng sẵn, nó được gọi là '_Bool'. Để trình biên dịch biết 'true' và' false', người ta phải '#include ', những thứ này không được tích hợp sẵn - nhưng sau đó bạn cũng có thể sử dụng 'bool' thay vì' _Bool' (một chút xấu xí) . –

4

Bao gồm stdbool.h để sử dụng các phép toán C99.
Nếu bạn muốn gắn bó với C89 xác định nó cho mình:

typedef enum 
{ 
    true=1, false=0 
}bool; 
+0

Nếu bạn không có 'stdbool.h' chỉ dính vào những gì sẽ làm, cụ thể là cho preprocessor định nghĩa cho các giá trị này và không liệt kê. –

+0

Tôi nghĩ rằng ưu tiên xử lý trước định nghĩa trên enums hoặc viceversa chỉ là một hình thức trong những trường hợp này. –

30

Từ định danh true không được khai báo theo mặc định. Để sử dụng, hai giải pháp:

  1. Biên dịch C99 và bao gồm <stdbool.h>.
  2. Xác định số nhận dạng này một mình.

Tuy nhiên, vòng lặp vô hạn for (;;) thường được coi là kiểu tốt hơn.

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