2016-04-25 3 views
0

Comment puis-je demander à GCC ou à Clang de m'avertir de l'erreur ci-dessous, où M était supposé être N à la ligne 2?Avertissement concernant un pragma d'empaquetage incorrect

Même avec -Wall -Wextra -Wunknown-pragmas, aucun de ces compilateurs n'émet d'avertissement.

#define N 4 
#pragma pack(push, M) 

int main() { 
    return 0; 
} 

#pragma pack(pop) 
+1

#ifndef M #error M non défini #endif –

Répondre

0

Le compilateur ne peut pas connaître vos intentions, seulement si le code est valide. Vous pouvez vérifier sur vous-même avec ce

#ifndef M 
    #error M not defined 
#endif 

Ou si M a été défini séparément N avec ce

#if M != N 
    #error M is not N 
#endif 
0

Si vous regardez la sortie du préprocesseur du pragma n'est pas évalué à savoir si vous ajoutez N vous n'obtiendrez pas 4 une fois le préprocesseur terminé.

Je ne pense pas que vous puissiez avoir un avertissement ici, au moins pas facilement, peut-être un assistant de préprocesseur pourrait être en mesure de le comprendre. L'avertissement suivant n'aide pas, sauf s'il s'agit d'une valeur indéfinie dans une instruction #if.

-Wundef 

Si vous essayez d'ajouter quoi que ce soit à la pragma-à-dire

#pragma pack(push, (M + 0)) 

Vous obtenez un avertissement parce que le pragma attend un entier ou un identificateur-à-dire

warning: expected integer or identifier in '#pragma pack' 
+1

Vous semblez supposer que l'identificateur 'M' sera traité de la même manière dans un # pragma que dans un' #i fdef' directive. Bien que cela semble plausible, la norme laisse entièrement la place à la mise en œuvre, pour autant que je sache. Avez-vous des documents GCC ou Clang qui soutiennent votre conclusion? –

+0

@JohnBollinger Vous avez raison, il n'est pas géré de la même manière sur clang, il n'est pas évalué autant que je sache. – Harry