Package: cpp Version: 3:3.3-2 Severity: normal Tags: upstream If an enumerated type is used in #if statements no warning/error is given and the TRUE branch of the #if is always executed.
Using enum in #if is declared illegal by K&R along with cast and sizeof (page 91, paragraph 2 of 4.11.3 of "The C Programming Language, Second Edition" [ANSI C]). We use enum and #defines fairly interchangeably in header files for project constants and ran into a case where I want to conditionally compile code based on the value of the constant -- which happened to be an enumerated type. If the constant is a #define it works great. If the constant is an enum value it always evaluates the TRUE case of the #if ... #endif which is not obvious when reading the code. ---- sample code follows ---- #include <stdio.h> enum {S=32, T=33}; #define MY T int main(void) { #if (MY == S) printf("MY(%d) == S\n", MY); #else printf("MY(%d) != S\n", MY); #endif return 0; } ---- end of sample code ---- If the enum {S=32, T=33}; is replaced with #define S 32 #define T 33 the code compiles properly. Since normally the constants/enums are lost in some project header file you won't necessarily know if it was created by an enum or a #define and some warning or error message would be appreciated. Many thanks for an awesome compiler guys! Regards, Bernt -- System Information: Debian Release: testing/unstable Architecture: i386 Kernel: Linux gollum 2.4.21-k7 #1 Wed Jul 2 13:30:26 EDT 2003 i686 Locale: LANG=en_CA, LC_CTYPE=en_CA Versions of packages cpp depends on: ii cpp-3.3 1:3.3.1-0pre0 The GNU C preprocessor -- no debconf information