2015-05-29 34 views
5

Tôi đã xem qua tình hình thời gian gần đây mà sau xây dựngCó bất kỳ trình biên dịch C sẽ cảnh báo về việc sử dụng định nghĩa không khai báo

#if BYTE_ORDER == LITTLE_ENDIAN 
    do_something(); 
#endif 

kết quả trong 'do_something()' được biên soạn nếu không BYTE_ORDER cũng không LITTLE_ENDIAN được xác định. Trong khi đây không phải là hành vi không hợp lý, tôi không thể tìm thấy bất kỳ tùy chọn nào trên gcc để cảnh báo cho tôi về tình huống này.

Nếu không có cảnh báo, bạn có thể gặp tình huống khá đáng lo ngại khi ai đó có thể xóa tiêu đề chưa được sử dụng và nó sẽ thay đổi hoàn toàn kết quả biên dịch, vì nó được bao gồm tiêu đề xác định hai macro đó chúng khác nhau).

+8

'man gcc':' -Wundef Cảnh báo nếu số nhận dạng không xác định được đánh giá trong chỉ thị #if.' Vì vậy, 'echo '#if BYTE_ORDER == LITTLE_ENDIAN' | gcc -E - -Wundef' in' : 1: 5: cảnh báo: "BYTE_ORDER" không được xác định [-Wundef] '. – Biffen

+0

cảm ơn - hãy đưa ra câu trả lời cho các điểm! –

+2

Bạn có thể yêu cầu cả hai bên được xác định với '# nếu định nghĩa (BYTE_ORDER) && định nghĩa (LITTLE_ENDIAN) && BYTE_ORDER == LITTLE_ENDIAN' – dasblinkenlight

Trả lời

5

Từ man gcc:

-Wundef 
    Warn if an undefined identifier is evaluated in an #if directive. 

Như vậy:

echo -e '#if BYTE_ORDER == LITTLE_ENDIAN\n#endif'|gcc -E - -Wundef 

Prints:

# 1 "<stdin>" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "/usr/include/stdc-predef.h" 1 3 4 
# 1 "<command-line>" 2 
# 1 "<stdin>" 
<stdin>:1:5: warning: "BYTE_ORDER" is not defined [-Wundef] 
<stdin>:1:19: warning: "LITTLE_ENDIAN" is not defined [-Wundef] 

Và nó được thậm chí tốt hơn với -Werror=undef.

+0

cho nó không có trong Wall, tôi có một cảm giác khó chịu nó có thể có vấn đề với tiêu đề chuẩn –

+5

Mọi thứ đều tốt hơn với '-Werror' (Vâng không lúc đầu, nhưng nó là tốt: D) ​​ – Eregrith

+0

nghĩ @TomTanner Thú vị. Tôi sẽ để nó vào cho đến khi nó thực sự là một vấn đề, và sau đó sử dụng [pragmas chẩn đoán] (https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html) để tắt nó đi cho các tiêu đề có vấn đề hoặc chỉ cần bật nó lên nơi tôi thực sự muốn nó. – Biffen

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