Целочисленная арифметика? Запустите следующую программу, чтобы узнать:
#include "stdio.h"
int main() {
#if 1 + 1 == 2
printf("1+1==2\n");
#endif
#if 1 + 1 == 3
printf("1+1==3\n");
#endif
}
Ответ «да», есть способ заставить препроцессор выполнять целочисленную арифметику, то есть использовать его в условии препроцессора.
Обратите внимание, что ваши примеры не являются целочисленной арифметикой. Я только что проверил, и препроцессор gcc завершится неудачей, если вы попытаетесь сделать сравнение с плавающей запятой. Я не проверял, допускает ли когда-либо стандарт арифметику с плавающей запятой в препроцессоре.
Обычное расширение макроса не оценивает целочисленные выражения, оно оставляет его компилятору, что можно увидеть по предварительной обработке (-E в gcc):
#define ONEPLUSONE (1 + 1)
#if ONEPLUSONE == 2
int i = ONEPLUSONE;
#endif
Результат равен int i = (1 + 1);
(плюс, вероятно, некоторые вещи, указывающие имена исходных файлов и номера строк и тому подобное).