Arithmétique entière? Exécutez le programme suivant pour savoir:
#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
}
réponse est « oui », il y a un moyen de faire le préprocesseur effectuer l'arithmétique entière, ce qui est de l'utiliser dans un état de préprocesseur.
Notez cependant que vos exemples ne sont pas arithmétiques entiers. Je viens de vérifier, et le préprocesseur de gcc échoue si vous essayez de le faire faire des comparaisons flottantes. Je n'ai pas vérifié si la norme autorise l'arithmétique à virgule flottante dans le préprocesseur.
macro expansion régulière n'évalue pas les expressions entières, il laisse au compilateur, comme on peut le voir par prétraiter (-e gcc) les éléments suivants:
#define ONEPLUSONE (1 + 1)
#if ONEPLUSONE == 2
int i = ONEPLUSONE;
#endif
Le résultat est int i = (1 + 1);
(plus probablement des choses pour indiquer les noms de fichier source et les numéros de ligne et autres).
PI est pas un nombre entier dans l'exemple; par conséquent, ni OP ni OP2 ne seraient des entiers si le préprocesseur était forcé de les évaluer. Et les opérandes de '%' ne peuvent pas être des nombres à virgule flottante. –