27 votes

Existe-t-il une manière élégante de forcer la comparaison de deux constantes?

Comme nous le savons tous, le code suivant va être optimisée par l'raisonnable compilateurs:

const int a = 3;
const int b = 42;

if (a == b)
{
    do_something();
}

Si les deux constantes sont les mêmes, l' if est omis, la fonction appelle toujours, si elles sont différentes, l'ensemble du bloc est omis.

Cependant, il peut y avoir des situations où il est important de ne PAS optimiser ce code, que le programme lui-même peut être modifié avant d'être exécuté. E. g. le binaire se trouve dans la mémoire flash et peut être consulté par un programme externe, et bien sûr les adresses des deux consts sont fixes. (a un sens dans l'embarqué).

Je suis en train de penser à l'aide de #pragma, mais qui ne fait pas partie de la norme.

Un autre moyen serait d'utiliser const volatile. C'est que la garantie de travailler sur tous conformes à la norme compilateurs?

23voto

Timothy Jones Points 10760

Oui, const volatile int a = 3; fait exactement ce que vous voulez et est conforme aux normes à partir de C89 (voir section 3.5.3 de C89).

Cette excellente réponse décrit en détail const volatile , pour une utilisation dans une situation similaire à la vôtre.

6voto

Nik Bougalis Points 7521

L' const volatile devrait faire l'affaire parce que la comparaison exige une "lecture" de la les deux volatile variables - et la norme garantit le lit sera considérée comme ayant observables effets secondaires.

Par conséquent, ils ne peuvent pas simplement être optimisé à l'écart.

Je dois vous demander, quel problème essayez-vous de résoudre qui a besoin de cette solution? En expliquant le problème, ce qui nous permet de vous offrir des conseils et des solutions vous ne pouvez pas avoir considéré qui n'auront pas besoin de ce genre de hoop de saut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X