Je repassais le C++ FAQ Lite en ligne. Je regardais inline à nouveau puisque je ne l'ai pas trouvé une utilisation pour eux et je voulais savoir comment l'arrêté de la dépendance circulaire comme montré dans this réponse. J'ai d'abord essayé de faire, "Pourquoi les inlines sont meilleurs que les définitions." exemple avec le code suivant:Définir ne pas évaluer POD?
#define unsafe(i) \
((i) >= 0 ? (i) : -(i))
inline
int safe(int i)
{
return i >= 0 ? i : -(i);
}
int f();
int main(void)
{
int x(5);
int ans;
ans = unsafe(x++);
cout << ans << endl;
ans = unsafe(++x);
cout << ans << endl;
ans = safe(x++);
cout << ans << endl;
ans = safe(++x);
cout << ans << endl;
std::cin.get();
return 0;
}
EDIT:
Grand. J'ai eu la faute de frappe. Pas que je suis amer que je ne trouve pas de telles erreurs ou quoi que ce soit.
La sortie est maintenant 6, 9, 9, 11
.
Cependant, même avec une pré-incrémentation, la première valeur ne devrait-elle pas donner 7?
Si la macro est appelée deux fois, puis ne pas se présenter comme suit:
dangereux (x) // pré-incrémentation ne modifie pas la valeur lorsqu'elle est appelée. Non sécurisé (++ x) // pour toutes fins utiles, l'incrémentation se produit avant le deuxième appel, donc le ++ x. C'est pour le premier ans = unsafe(x++)
s'il est appelé deux fois.
Au moment où nous atteignons le deuxième ans = unsafe(++x)
, ne devrait pas avoir été incrémenté deux fois? Une fois par le double appel et une fois lorsque le premier double appel a été terminé?
Je ne sais pas si c'est une faute de frappe ici, ou dans votre code actuel, mais la macro devrait être '((i)> = 0? (I): - (i))'. ('?' au lieu de '=') –
Oui, oui c'est le cas. C'est tout à fait l'erreur stupide. – IAE