C4127: L'expression conditionnelle est constante
Le code suivant génère un avertissement C4127 (expression conditionnelle est constant) dans Visual Studio 2010 (où alias_wchar_t est un alias pour wchar_t):
if (sizeof(alias_wchar_t) == sizeof(wchar_t)) //warning occurs here
{
//do stuff
}
else
{
//do other stuff
}
Ce qui est la façon la plus élégante pour résoudre ce problème, bref de suppression de l'avertissement?
La meilleure solution que j'ai trouvé est de farcir le conditionnel en static bool, et de l'utiliser comme condition. Il y a une bonne quantité de code ci-dessus et en dessous de la si-sinon, j'ai donc envelopper le tout dans des accolades pour limiter la portée de la variable autant que possible:
//<snip>
{
static bool isSameSize = (sizeof(alias_wchar_t) == sizeof(wchar_t));
if (isSameSize)
{
//do stuff
}
else
{
//do other stuff
}
}
//<snip>
Ce qui se sent assez brut. Cela semble comme il devrait être résolu au moment de la compilation plutôt que de l'exécution, mais le préprocesseur ne sais pas à propos de sizeof. Est-il plus propre, plus élégante façon de résoudre ce problème?
source d'informationauteur Christopher Berman
Vous devez vous connecter pour publier un commentaire.
Il semble que vous savez ce qui se passe, et vous êtes très bien avec ce.
Compilateur
pragma
s sont destinés à des cas comme celui-ci:Essentiellement, vous indiquez le compilateur (et plus important encore, pour les lecteurs de votre code) que vous avez pris connaissance de l'avertissement, et que vous savez ce que vous faites.
La condition est connue au moment de la compilation, de sorte que vous pouvez faire le chèque au moment de la compilation, trop. Ne pas utiliser un
if
il suffit de laisser le compilateur insérer un appel à la bonne fonction. Voici un exemple complet:Si c'est vraiment plus élégante que votre code d'origine (avec juste ce message d'avertissement du compilateur est désactivé pour cette unité de compilation) est opinion, je dirais.
Dans tous les cas, cette compile avec pas d'avertissements à
/W4
CR 2013.Une autre façon de désactiver l'avertissement est de créer une fausse identité de la fonction et de l'utiliser sur l'une des constantes.
Ce n'est pas parfait, mais semble plus léger que les autres solutions et réutilisables pour les différents type de constantes.
C'est ce que je suis venu avec. Il ne cause pas de mises en garde dans Microsoft Visual Studio 2013 et il ne nécessite pas que vous utilisez Visual C++ spécifiques Pragmas.
D'abord définir le modèle suivant de la classe.
De l'utiliser ensuite comme suit.
J'ai eu l'idée de le C++14 std::conditionnel décrit à http://en.cppreference.com/w/cpp/types/conditional.
Si c'est juste une expression constante alors utiliser:
Il semble que le c4127 est généré par la seule action de l'évaluation d'une expression constante dans le contrôle de la déclaration.