attention avec #define le parametre passe est evalue a chaque fois:
ce qui veut dire que si on appele C1 ou F1 avec f++ on incremente 2 fois la valeur f donc dans un appel define pas de calcul sur le parametre.
La meilleure solution me semble etre l'inline:
petit code d'example ( mieux qu'un long discourt)
main()
{
inline int C1(float x) { return (x) < (0) ? ((int)x) : ((int)(x+1)); }
inline int F1(float x) { return (x) < (0) ? ((int)(x-1)) : ((int)(x)); }
#define C2(x) ( (x) < (0) ? ((int)x) : ((int)(x+1)))
#define F2(x) ( (x) < (0) ? ((int)(x-1)) : ((int)(x)))
float f1=-2.35;
float f2=-2.35;
printf("val1 =%f F1=%i C1=%i\n",f1,F1(++f1),C1(f1)); // correct 1 seul ++f
printf("val2 =%f F2=%i C2=%i\n\n",f2,F2(++f2),C2(f2)); // bad 2 ++f
printf("val1 =%f F1=%i C1=%i\n",f1,F1(++f1),C1(f1));
printf("val2 =%f F2=%i C2=%i\n\n",f2,F2(++f2),C2(f2));
printf("val1 =%f F1=%i C1=%i\n",f1,F1(++f1),C1(f1));
printf("val2 =%f F2=%i C2=%i\n\n",f2,F2(++f2),C2(f2));
printf("val1 =%f F1=%i C1=%i\n",f1,F1(++f1),C1(f1));
printf("val2 =%f F2=%i C2=%i\n\n",f2,F2(++f2),C2(f2));
}
Resultat du code
val1 =-1.350000 F1=-2 C1=-1
val2 =-2.350000 F2=-1 C2=0
val1 =-0.350000 F1=-1 C1=0
val2 =-0.350000 F2=1 C2=2
val1 =0.650000 F1=0 C1=1
val2 =1.650000 F2=3 C2=4
val1 =1.650000 F1=1 C1=2
val2 =3.650000 F2=5 C2=6
voila vaoila
