2012-03-30 22 views
16

Trong một đánh giá Tôi đã xem qua một đoạn mã như sau:#if được xác định (x) || (y); điều này có hợp lệ không?

#if defined(x) || y 

không tuyên bố trên có ý nghĩa gì? Liệu điều kiện có thực thi đúng không?

+0

* Thực thi * không phải là từ phù hợp. Mã đó được xử lý trước khi biên dịch. Tôi không chắc về tính chính xác của cú pháp, nhưng nó có thể nhận được * đánh giá cao nhất * nhưng thường là cú pháp đúng của "#if đã xác định (x)" là "#IFDEF x" –

Trả lời

20

Có nó hợp lệ.

Dưới đây là những gì các tiêu chuẩn (C99) cho biết trong 6.10p1:

if-group: 
# if constant-expression new-line groupopt 
# ifdef identifier new-line groupopt 
# ifndef identifier new-line groupopt 

các nhà điều hành defined được xem như là một phần tử unary của một biểu thức hằng số (6.10.1p1).

Trong ví dụ của bạn, tình trạng này được đánh giá là true nếu vĩ mô x được định nghĩa HOẶC nếu y được định nghĩa và khác biệt so với 0

3

Có, kể từ defined(x) là một boolean và trả về true hoặc false.

Câu lệnh trên có nghĩa là "hoặc x được xác định hoặc y là true".

+5

... hoặc cả hai. :) – phimuemue

10

Lý do cho điều này là gấp đôi.

Thay vì sử dụng một #ifdef, bạn sử dụng các nhà điều hành defined để bạn có thể sử dụng toán tử logic vào nó (&&, ||, vv), do đó bạn không cần phải sao chép mã của bạn để nó được bao gồm đúng nếu có nhiều tiêu chí cho những gì bạn cần xác định.

Ngoài ra, theo ý kiến ​​của tôi, tôi tìm thấy nó dễ dàng hơn để đọc như #if defined(x) hơn #ifdef x, và bạn có thể làm như sau #if defined(x) && defined(y), trong khi đó là không thể với #ifdef.

1

nó là chính xác nhưng nó là một thực tế xấu. Tại sao sử dụng hai đánh giá khác nhau ('y' và 'đã xác định (x)') trong một giá trị có điều kiện. Nó có thể gây nhầm lẫn cho người khác. Ví dụ dưới đây cho thấy việc sử dụng phổ biến hơn || và & & operatiors chống lại các macro #defined:

#define AA 1 
#define BB 2 
#if (defined AA) || (defined BB) 
    #warning "A or B" 
#endif 
#if (defined AA) && (defined BB) 
    #warning "A and B" 
#endif 

Khi mã trên được chạy người sử dụng sẽ nhận được các thông báo trên màn hình:

#warning "A or B" 
#warning "A and B" 

Nhưng nếu mã là như thế này (AA là không xác định):

#undefine AA 
#define BB 2 
#if (defined AA) || (defined BB) 
    #warning "A or B" 
#endif 
#if (defined AA) && (defined BB) 
    #warning "A and B" 
#endif 

sau đó người dùng sẽ nhận được tin nhắn này:

#warning "A or B" 
+0

lưu ý rằng cú pháp bạn sử dụng ở đây khác: "x được xác định" thay vì "được xác định (x)". cả hai đều mang lại kết quả tương tự. – StarShine

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