INF: #define Must Evaluate to Integer Const for #if Expression

ID Number: Q69934

5.00 5.10 6.00 6.00a 6.00ax 7.00 | 5.10 6.00 6.00a

MS-DOS | OS/2

Summary:

In Microsoft C versions 5.1, 6.0, 6.0a, 6.0ax, and C/C++ version 7.0,

when using the #define statement to define a constant, its value must

evaluate to an integer constant if it is to be used as the expression

in an #if, #elif, or #else compiler directive. In addition, for any

undefined constant that is used, the preprocessor assumes a value of

zero.

If you are not sure how the compiler is handling certain directives,

you can compile the code with one of the preprocessor options (/P /E

/EP). This will allow you to see the exact effect of the preprocessor

directives on the code.

More Information:

If a #define'd constant that does not evaluate to an integer constant

is used with the #if, #elif, or #else compiler directive, the

following error will result:

fatal error C1017: invalid integer constant expression

For example, this error will occur with the following code fragment:

#define CONSTANT_NAME "YES"

#if CONSTANT_NAME

...

#endif

Because CONSTANT_NAME evaluates to a string constant and not an

integer constant, the #if directive will generate a C1017 error and

halt the compiler.

The other notable situation is that any constant that is undefined is

evaluated by the preprocessor to be zero. If an undefined constant is

used inadvertently, unintended behavior may result. For example, in

the following code fragment, the result is the reverse of what is

actually intended:

#define CONSTANT_NAME YES

#if CONSTANT_NAME

Code to use on YES...

#elif CONSTANT_NAME==NO

Code to use on NO...

#endif

In this example, YES is undefined, so it evaluates to zero. Therefore,

CONSTANT_NAME is also zero. Thus, the #if expression "CONSTANT_NAME"

evaluates to false and the "Code to use on YES" is removed by the

preprocessor, which is clearly NOT the intended behavior. Furthermore,

since NO is also undefined, it also evaluates to zero, which means

that the #elif expression "CONSTANT_NAME==NO" evaluates to true

(0==0). This causes the preprocessor NOT to remove the "Code to do on

NO", which is also NOT the intended behavior.

By compiling with one of the preprocessor options (/P /E /EP), you can

observe the preprocessor output in order to see exactly how the

preprocessor is interpreting all directives. For more information on

these options, consult the documentation or online help that

accompanies your particular version of the compiler.

Additional reference words: 5.10 6.00 6.00a 6.00ax 7.00