Je travaille sur Win7 en utilisant VS2010 avec une base de code qui utilise intensément le framework Qt 5.1.1, et nous avons placé notre niveau d'avertissement de compilation à 4 afin que nous puissions en attraper autant ou nos propres problèmes que possible. Nous utilisons la version gratuite de Qt, donc je suppose que c'est peut-être là que réside le problème, mais nous recevons beaucoup d'avertissements des en-têtes Qt inclus.C++ Nesting pragma warning push/pop
J'ai créé deux fichiers d'en-tête, une avec les éléments suivants:
// header file 1
#pragma warning(push)
#pragma warning(disable: 4091)
#pragma warning(disable: 4127)
#pragma warning(disable: 4231)
#pragma warning(disable: 4244)
#pragma warning(disable: 4251)
#pragma warning(disable: 4481)
#pragma warning(disable: 4512)
#pragma warning(disable: 4718)
#pragma warning(disable: 4800)
et l'autre avec les éléments suivants:
// header file 2
#pragma warning(pop)
Et puis autour de tous les inclure un fichier d'en-tête Qt ou un groupe de Qt En-tête des fichiers dans le code, j'ai précédé cela en incluant le fichier en-tête 1, puis après le dernier en-tête Qt je l'ai terminé en incluant le fichier en-tête 2. Cela fonctionne très bien dans un petit projet dans la solution , Je reçois encore beaucoup d'avertissements pour les codes que j'ai Sabled dans mon fichier d'en-tête 1.
J'ai eu un soupçon et fait un grep à travers l'arbre source Qt entière et a constaté qu'il y a certains en-têtes qui font eux-mêmes des push/pop d'avertissement pragma. Certains d'entre eux le font au milieu du code, et je commence à me demander si mon coup est fermé par leur pop.
Ma question est la suivante: une directive #pragma warning (push) peut-elle être imbriquée, comme avec un #ifdef? En d'autres termes, tout comme je peux le faire:
#ifdef DEF1
#ifdef DEF2
<dosomething>
#endif // for DEF2
#endif // for DEF1
Est-il possible de faire ce qui suit:
// outer layer - my cpp file about to include a Qt header
#pragma warning(push)
#pragma warning(disable: 4091)
// inner layer - included Qt header file pushes and pops and then continues with more code
#pragma warning(push)
#pragma warning(disable: 2403)
<some code that actually uses this stuff>
#pragma warning(pop)
// back to outer layer - my file after the Qt header include
#pragma warning(pop)
Ou la première pop pop en fait à la fois? J'aurais pensé que ça nicherait, puisqu'il est supposé pousser sur une pile, mais je n'arrive pas à trouver une autre raison pour laquelle je vois encore ces avertissements Qt. Les avertissements Qt eux-mêmes font référence aux fichiers Qt, comme celui-ci:
6>c:\qt\qt5.1.1\5.1.1\msvc2010\include\qtcore\qhash.h(72): warning C4127: conditional expression is constant
Des idées à ce sujet? Je l'ai regardé autour de push/pop d'avertissement de pragma imbriqué, mais ne voir personne en parler, et la page MSDN sur l'alerte ne dit rien:
https://msdn.microsoft.com/en-us/library/2c8f766e.aspx
Très important c'est nettoyée, parce que le véritable objectif est de commencer à traiter les avertissements internes qui ont été négligés à cause du déluge d'avertissements Qt.