SUMMARY
The Microsoft C Compiler does not allow a "#define" statement to
define another preprocessor directive. Although the preprocessor
output option (/P or /E) generates the desired expansion, the
Microsoft C Compiler generates the following error messages when
compiling the code below:
error C2014: preprocessor command must start as first non-whitespace
error C2054: expected '(' to follow 'define'
error C2061: syntax error : identifier 'MAX'
Microsoft C/C++ for Windows NT, version 8.0, generates the following
errors on the code shown below:
error C2014: preprocessor command must start as first nonwhite space
error C2065: 'MAX' : undeclared identifier
error C2057: expected constant expression
The Microsoft C/C++ compiler included with Visual C++, 32-bit edition,
version 4.0, generates the following errors on the code shown below:
error C2121: '#' : invalid character : possibly the result of a macro expansion
error C2282: 'define' is followed by 'MAX' (missing ','?)
The Microsoft C/C++ compiler included with Visual C++, 32-bit edition, versions 5.0 and 6.0, generates the following errors on the code shown below:
error C2121: '#' : invalid character : possibly the result of a macro expansion
error C2146: syntax error : missing ';' before identifier 'MAX'
error C2501: 'define' : missing storage-class or type specifiers
fatal error C1004: unexpected end of file found
Sample Code
The following code demonstrates the problem:
/* Compile options needed: none
*/
#define A( x ) x##define MAX 100
A( # )
/*
Preprocessor output expands A( # ) to be:
#define MAX 100
*/
char w[ MAX ];
void main(void);
void main()
{
w[ 0 ] = w[ MAX ];
}