2012-03-10 18 views
5

Đối với mã biên dịch cụ thể, đó là phổ biến để xem chỉ thị cpp như:C macro Preprocessor - nét so với giá trị di & thực hành

#if defined (__GNUC__) && (__GNUC__ >= 4)

đó là kiểm tra Preprocessor Tôi thường sử dụng - không dành riêng cho __GNUC__, nhưng đó là một ví dụ phổ biến. Ngoài ra,

#if (__GNUC__ >= 4)

dường như đáp ứng các yêu cầu tương tự. Có vấn đề tiềm năng với sau này? Không chỉ với gcc, mà còn bất kỳ bộ tiền xử lý chuẩn nào. LHS có thể được đánh giá là một giá trị nhất định, ngay cả khi nó không được xác định? Có bất kỳ cạm bẫy nào đối với phương pháp thứ hai mà bất kỳ luật sư ngôn ngữ nào cũng biết không?

Trả lời

5

Bộ tiền xử lý giả định các macro chưa xác định có giá trị 0 so sánh, vì vậy, việc đơn giản hóa của bạn là ok trong trường hợp này. Nếu bạn muốn kiểm tra phiên bản thấp hơn 4 trong gcc, bạn có thể gặp rắc rối mặc dù vì nó sẽ đánh giá là true với < ngay cả khi nó không phải là gcc.

Tôi nghĩ lý do cho việc sử dụng cả hai cũng là một vấn đề dễ hiểu, nếu bạn kiểm tra

#if defined(__GNUC__) && (__GNUC>=4) 

nó khá rõ ràng bạn đang không đã có trong một khối với mã mà chỉ dành cho GCC, trong khi đơn giản hóa

#if (__GNUC__ >= 4) 

không làm cho điều đó rõ ràng và chỉ có thể được đọc dưới dạng kiểm tra phiên bản khi bạn đã biết là gcc.

+0

Hoàn toàn đồng ý rằng lựa chọn đầu tiên là tốt hơn vì nó làm cho mục đích rõ ràng hơn và không tốn chi phí. Nó cũng tránh được khả năng không chính xác 'thông qua' mà nhiều trường hợp trình biên dịch/nền tảng được đánh giá. –

2

Trong trường hợp GNUC, khi bạn đang thử nghiệm nó theo cách khác xung quanh, nó sẽ làm điều sai:

#if (__GNUC__ < 4) 

Tôi nghĩ cái này sẽ đúng ngay cả khi GNUC không được định nghĩa.

+1

+1, ví dụ phản hồi tốt. –

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