Multi-caractère des avertissements constants
Pourquoi est-ce un avertissement? Je pense qu'il y a de nombreux cas où les est plus facile à utiliser multi-char int constantes au lieu de "pas de sens" numéros ou au lieu de définir const variables avec la même valeur. Lors de l'analyse de l'onde/tiff/autres types de fichiers est plus clair pour comparer les valeurs lues avec quelques "EVAW', 'données', etc au lieu de leurs valeurs correspondantes.
Exemple de code:
int waveHeader = 'EVAW';
Pourquoi est-ce que donner un avertissement?
- Je vais avoir du mal à essayer de comprendre votre question. Pouvez-vous faire plus clair?
- Je vais essayer:) Désolé
- Connexes: stackoverflow.com/questions/7497192/enum-constants-questions
- Ce qui semble fonctionner et est bien lisible, mais peut-être pas exactement sûr est de style c-cast littéraux de chaîne à
int*
:int waveHeader = *((int*)"wave");
. — J'ai une plus grande confiance, sentiment à propos de la solution, j'ai tellement loin avec: pourmemcpy
le littéral de chaîne dans une union de type int(s) et l'omble chevalier. Cela introduit une surcharge, mais ce n'est généralement leglectable – au moins si elle ne se produit que dans le fichier d'en-tête. - Sur Visual Studio 2008, il ne semble pas donner un avertissement, et donne les mêmes résultats que "int v = 'w' | 'a' << 8 | 'v' << 16 | 'e" << 24;"
- Ré-ouvert et converti à cette question à l'adresse C seulement, puisque c'est ce que les réponses sont sur le.
- la réponse par "o11c" est sur le C++
- Les dangers de l'utilisation de caractères multi-constantes: habr.com/en/company/pvs-studio/blog/457694
Vous devez vous connecter pour publier un commentaire.
Selon la norme (§6.4.4.4/10)
Ceci est valable ISO 9899:2011 C. Il se compile sans avertissement en vertu de l'
gcc
avec-Wall
, et un “multi-caractère caractère constant” avertissement avec-pedantic
.De Wikipédia:
Pour la portabilité souci, ne pas utiliser de caractères multi-constantes avec les types intégraux.
int
).Cet avertissement est utile pour les programmeurs qui serait à tort d'écrire
'test'
où ils devraient avoir écrit"test"
.Cela arrive beaucoup plus souvent que les programmeurs qui ne veulent réellement multi-char int constantes.
'test'
que ce serait rendre votre code non portableSi vous êtes heureux, vous savez ce que vous faites et que vous pouvez accepter les problèmes de portabilité, sur GCC par exemple, vous pouvez désactiver l'avertissement sur la ligne de commande:
- Je l'utiliser pour mes propres applications pour travailler avec AVI et MP4 fichier d'en-têtes pour des raisons semblables à vous.
Même si vous êtes prêt à regarder jusqu'à ce que le comportement de votre application définit, multi-constantes de caractère sera encore varient avec l'endianness.
Préférable d'utiliser un (POD) struct { char[4] }; ... et ensuite utiliser un UDL comme "la VAGUE"_4cc de construire facilement les instances de cette classe
Plus simple C/C++ n'importe quel compilateur/conforme à la norme de la solution, a été mentionné par @leftaroundabout dans les commentaires ci-dessus:
Ou un peu plus spécifique:
La solution, également compatible avec n'importe quel compilateur C/C++/standard (à l'exception de clang++, qui a un bug connu):
Ici "abcd" littéral de chaîne est coulé dans un tableau, puis anonymes de l'union est utilisé pour donner un joli symbole-nom souhaité résultat numérique.