¿Aritmética entera? Ejecutar el programa siguiente para averiguar:
#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
}
respuesta es "sí", hay una manera de hacer que el preprocesador realizar aritmética de enteros, que es para usarlo en una condición preprocesador.
Sin embargo, observe que sus ejemplos no son aritméticos enteros. Acabo de verificar y el preprocesador de gcc falla si intentas hacer comparaciones flotantes. No he comprobado si el estándar permite alguna vez la aritmética de coma flotante en el preprocesador.
expansión de la macro regular no evalúa expresiones enteras, lo deja para el compilador, como puede verse por el procesamiento previo (-E en gcc) lo siguiente:
#define ONEPLUSONE (1 + 1)
#if ONEPLUSONE == 2
int i = ONEPLUSONE;
#endif
El resultado es int i = (1 + 1);
(más probablemente un poco de materia para indicar nombres de archivos de fuente y números de línea, etc.).
PI no es un entero en el ejemplo; por lo tanto, ni OP ni OP2 serían enteros si el preprocesador se viera obligado a evaluarlos. Y los operandos de '%' no pueden ser números de coma flotante. –