Fatal Error C1017

invalid integer constant expression

The expression in an #if directive did not exist or did not evaluate to a constant.

Constants defined using #define must have values that evaluate to an integer constant if they are used in an #if, #elif, or #else directive.

The following sample generates C1017:

// C1017.cpp
#define CONSTANT_NAME "YES"
#if CONSTANT_NAME   // C1017
#endif

Possible resolution:

// C1017b.cpp
// compile with: /c
#define CONSTANT_NAME 1
#if CONSTANT_NAME
#endif

Because CONSTANT_NAME evaluates to a string and not an integer, the #if directive generates fatal error C1017.

In other cases, the preprocessor evaluates an undefined constant as zero. This can cause unintended results, as shown in the following sample. YES is undefined, so it evaluates to zero. The expression #if CONSTANT_NAME evaluates to false and the code to be used on YES is removed by the preprocessor. NO is also undefined (zero), so #elif CONSTANT_NAME==NO evaluates to true (0 == 0), causing the preprocessor to leave the code in the #elif portion of the statement — exactly the opposite of the intended behavior.

// C1017c.cpp
// compile with: /c
#define CONSTANT_NAME YES
#if CONSTANT_NAME
   // Code to use on YES...
#elif CONSTANT_NAME==NO
   // Code to use on NO...
#endif

To see exactly how the compiler handles preprocessor directives, use /P, /E, or /EP.