На самом деле директива #if считает то, что справа, целыми числами.
Так что, если вы хотите достичь того, о чем просили, вы должны сделать некоторую арифметику. Например, сделайте файл test.c с:
#define VERSION 7
#if VERSION
#if VERSION - (VERSION % 10 )
#warning Number out of range (1-9)
#else
#warning Number in range (1-9)
#endif
#else
#warning Zero or not a number
#endif
Компилировать с
gcc -c -o /dev/null test.c
Вы получите сообщение:
«Ноль не числа» ... если ваша ВЕРСИЯ равна 0 или не оценивает (с точки зрения препроцессора) как целое число.
И если VERSION оценивается как целое число, вы получите первое или второе сообщение в соответствии с его значением.
Это позволит вам сделать то, что вы искали.
Документация на #if: http://gcc.gnu.org/onlinedocs/cpp/If.html
Обратите внимание, что целое число может быть выражено как: 123 или 0xCC или что-либо, что вычисляется как целочисленная константа после расширения рекурсивного макроса.
Если число с плавающей запятой, например: 3.14, оно считается равным нулю.
Вы не можете просто отличить 0 (целое число) от чего-то, что не является целым числом. Хотя, возможно, существует возможность использования конкатенации макросов, но это еще предстоит изучить.