2015-11-11 1 views
2

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.

Répondre

0

en utilisant un simple MCVE:

void test() 
{ 
#pragma warning(push) 
#pragma warning(disable : 4305) // 'initializing' : truncation from 'double' to 'float' 

#pragma warning(push) 
#pragma warning(disable : 4244) // conversion from 'double' to 'float', possible loss of data 
    { 
     float f; 
     double d = 21.0; 
     f = d; // warning C4244 : '=' : conversion from 'double' to 'float', possible loss of data 
    } 
#pragma warning(pop) 

    { 
     float ff = 1.02; // warning C4305: 'initializing' : truncation from 'double' to 'float' 
    } 
#pragma warning(pop) 

} 

et compilé avec Visual Studio 2013 (je ne l'ai pas vérifié les autres) se traduit par zéro avertissements. Cela indiquerait que les pop/push imbriqués (au moins naïvement) fonctionnent comme prévu. En fonction des bibliothèques externes, ils peuvent permettre effectivement des avertissements désactivés par avertissement si cela se fait avec des paires désactiver/par défaut (au lieu de paires push/pop):

void test() 
{ 
#pragma warning(push) 
#pragma warning(disable : 4305) // 'initializing' : truncation from 'double' to 'float' 

#pragma warning(disable : 4244) // conversion from 'double' to 'float', possible loss of data 
#pragma warning(disable : 4305) // 'initializing' : truncation from 'double' to 'float' 
    { 
     float f; 
     double d = 21.0; 
     f = d; // warning C4244 : '=' : conversion from 'double' to 'float', possible loss of data 
     f = 1.02; // warning C4305: 'initializing' : truncation from 'double' to 'float' 
    } 
#pragma warning(default : 4244) // conversion from 'double' to 'float', possible loss of data 
#pragma warning(default : 4305) // 'initializing' : truncation from 'double' to 'float' 

    { 
     // In this case, the following line results in a warning, 
     // despite the #pragma warning(disable : 4305) line above 
     float ff = 1.02; // warning C4305: 'initializing' : truncation from 'double' to 'float' 
    } 
#pragma warning(pop) 

} 

Dans ce cas, nous obtenons un avertissement à la ligne float ff = 1.02;, malgré la ligne #pragma warning(disable : 4305) en haut.Qu'est-ce que vous pouvez faire pour désactiver tous les avertissements du compilateur (de sorte que la valeur par défaut est désactivé) serait de remplacer votre

#pragma warning(push) 
#pragma warning(disable : 123456789) 
// included external code you don't want to hear about 
#pragma warning(pop) 

avec

#pragma warning(push, 0) 
// included external code you don't want to hear about 
#pragma warning(pop) 

qui se traduira par aucun avertissement du compilateur (avertissements éditeur de liens non inclus).