Desactiver un flag de compilation localement

En l'occurence -Werror=switch-enum

Le problème exposé dans ce sujet a été résolu.

Salut par ici,

Je reviens sollicité de l’aide car je ne trouve pas comment gérer ce petit problème.

Un peu de contexte :
J’ai intégré un projet dont la production est gérée au travers CMake et qui est paramétré pour ne laisser passer aucun warning, ils sortent en tant qu’erreur de compilation. Pas mal, seulement parmi les warnings activés se trouve le flag -Werror=switch-enum qui lève une erreur si certaines valeurs de l’enum ne sont pas présent dans les case d’un switch sur une variable de ce type.
Seulement, j’écris une fonction qui prend en charge un évenement Qt et l’enum est non seulement énorme, mais dépend aussi de la configuration de Qt.

Ma question :
Est-ce qu’il y aurait un moyen de dire au compilateur de ne pas passer le warning sur ce switch en particulier ?

Mes pistes :
Je cherchais des instructions préprocesseurs pour encadrer le switch.
Autrement j’ai pensé à etoffer la configuration CMake mais même en supposant que je bidouille, ça devrait affecter le fichier entier.
Et ma dernière solution est de gérer l’evènement au travers une serie de if else if plutôt qu’un switch, je trouve ça un peu moins lisible mais je n’ai que quelques valeurs à gérer alors ça ira.

Merci

+0 -0

Il y a peut être une instruction spécifique pour le compilo pour ignorer les erreurs sur ce switch, mais, honnêtement, le plus simpe est de rajouter un default: dans ton enum pour indiquer ce que tu fais dans les cas non explicitement traités (eventuellement rien du tout). C’est la manière la plus propre de dire au compilo et au développeur qui te relira ce que tu veux faire.

Ce flag demande justement (sous g++ en tout cas) que toutes les valeurs soient gérées explicitement sur les enums, j’ai un default mais s’il est juste pour le langage, cette option de warning restrictive ne s’en satisfait pas

+0 -0

Ah, effectivement. J’aurais tendance à virer ce flag, mais si tu veux ne toucher que ce bout de code, et faire du code spécifiquement pour GCC, il semble que la syntaxe soit la suivante: (j’ai pas testé)

default: ne fonctionne pas avec -Wswitch-enum qui impose que tous les enums soit utilisés même en présence de default. Le but étant de toujours avoir un switch qui prends tous les cas de figure. -Wswitch par contre accepte default.

Il faut soit ajouter -Wno-error=switch-enum qui donnera quand même avertissement, soit complètement désactiver l’avertissement avec -Wno-switch-enum. Plusieurs manière de faire:

  • Au niveau du CMakeLists.txt avec une règle spécifique pour le fichier en question.
add_library(no_switch_enum PRIVATE)
# L'option n'existe que pour clang et gcc
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  target_compile_options(no_switch_enum PRIVATE "-Wno-switch-enum")
endif()

target_link_libraries(${target} PRIVATE no_switch_enum)

Je n’ai pas testé, mais c’est quelque chose dans ce goût là.

Mais comme tu l’indiques, cette méthode est impacte le fichier dans son ensemble.

  • Désactiver localement l’avertissement avec des #pragma et le réactiver après:

En utilisant les macros qui se trouvent là: https://github.com/jonathanpoelen/falcon.cxx/blob/master/include/falcon/cxx/cxx.hpp#L610

FALCON_DIAGNOSTIC_PUSH
// clang accepte les `GCC diagnostic`.
FALCON_DIAGNOSTIC_GCC_IGNORE("Wswitch-wnum")
switch (...) {...}
FALCON_DIAGNOSTIC_POP

Super, c’est bien ça que je cherchais, merci les gars

Bien que je me ravise du coup, je préfère ecrire une serie de else if qu’une instruction que peu de développeur vont comprendre et qui est spécifique à un compilateur (ou au travers les macros pour supporter plusieurs compilo, mais on retombe sur des problème de lisibilité)

Du coup vraiment désolé de vous avoir sollicité pour rien, mais je vous remercie grandement tout de même et puis ça renforcera ma culture, c’est pas perdu, il pourrait y avoir des cas où j’en ai vraiment besoin

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte