ravim@gtenmc.UUCP (ravim) (08/25/90)
Is nesting of a preprocessor directive within a macro definition (RHS) not allowed? The following piece of code causes an error at the time of compilation. #define RET_NULL(str) return( \ #ifdef DEBUG (void) printf("DEBUG: %s\n", str), \ #endif (char *) 0) Upon running preprocessor, it dawned upon me that the compiler expanded RET_NULL macro as 'return( #ifdef DEBUG', and then gave syntax error at the next line, that is, '(void) printf ...'. The only way I could it make work properly is as follows: #ifdef DEBUG #define RET_NULL(str) return( \ (void) printf("DEBUG: %s\n", str), \ (char *) 0) #else #define RET_NULL(str) return((char *) 0) #endif The compiler I used is on Vax System V.3 (8810). Do any of the other compilers provide embedding a preprocessor directive within a macro definition? Is this allowed in standard C (old style or ANSI-style) syntax? I would be glad to know if someone could point out a better solution. Thanks. - Ravi (ravim@gtenmc.UUCP || ravim@gtenmc.gtetele.com)
henry@zoo.toronto.edu (Henry Spencer) (09/02/90)
In article <849@gtenmc.UUCP> ravim@gtenmc.UUCP (Ravi Kumar Mandava) writes: >Is nesting of a preprocessor directive within a macro definition (RHS) not >allowed? It is not possible. The very first thing that happens to ANSI C source during compilation is that backslashed newlines are stripped out, so any "#" within the RHS is no longer at the start of a line and hence does not begin a preprocessor directive. (And incidentally, the result of macro expansion "is not processed as a preprocessing directive even if it resembles one", section 3.8.3.4.) Some old C compilers may have permitted such things, due to the vagueness of the old definition of how the preprocessor features interacted. -- TCP/IP: handling tomorrow's loads today| Henry Spencer at U of Toronto Zoology OSI: handling yesterday's loads someday| henry@zoo.toronto.edu utzoo!henry