#pragma pack
Remonter à Présentation des directives pragma - Index
Sommaire
- 1 Syntaxe (Voir Pseudo-grammaire)
- 2 Description
- 2.1 #pragma pack sans arguments
- 2.2 #pragma pack utilisant une valeur pour n
- 2.3 #pragma pack utilisant push
- 2.4 #pragma pack utilisant push, identifier
- 2.5 #pragma pack utilisant push et n
- 2.6 #pragma pack utilisant pop
- 2.7 #pragma pack utilisant pop, identifier
- 2.8 #pragma pack utilisant pop et n
- 2.9 Conditions d'erreur
- 2.10 Conditions d'avertissement
Syntaxe (Voir Pseudo-grammaire)
#pragma pack([{push | pop}[,]] [identificateur[,]] [n])
Description
La directive #pragma pack(n)
revient à utiliser #pragma option
avec l'option de compilation -a
. n
représente l'alignement d'octets qui détermine comment le compilateur aligne les données en mémoire. Pour de plus amples informations, voir l'option de compilation -a
. #pragma pack
peut aussi être utilisée avec les arguments push et pop, offrant la même fonctionnalité que la directive #pragma option
avec push et pop.
Le tableau suivant compare l'utilisation de #pragma pack
avec #pragma option
.
#pragma pack | #pragma option |
---|---|
#pragma pack(n) |
#pragma option -an |
#pragma pack(push, n) |
#pragma option push -an |
#pragma pack(pop) |
#pragma option pop |
La directive #pragma pack
accepte également un argument identificateur qui doit être utilisé en combinaison avec push ou pop.
#pragma pack sans arguments
#pragma pack()
L'utilisation de #pragma pack
sans arguments définit la taille de package à l'alignement de départ –aX (qui a la valeur par défaut 8). L'alignement de départ -aX est considéré comme l'alignement au départ de la compilation APRES le traitement de toutes les options de la ligne de commande.
#pragma pack utilisant une valeur pour n
#pragma pack(8)
L'utilisation de #pragma pack
avec une valeur pour 'n' définit l'alignement en cours à 'n'. Les valeurs autorisées pour 'n' sont : 1,2,4,8 et 16.
#pragma pack utilisant push
#pragma pack(push)
L'utilisation de #pragma pack
avec push pousse l'alignement en cours dans la pile interne des alignements.
#pragma pack utilisant push, identifier
#pragma pack(push, ident)
L'utilisation de #pragma pack
avec push et un identificateur associe l'alignement poussé avec 'ident'.
#pragma pack utilisant push et n
#pragma pack(push, 8) #pragma pack(push, ident, 8)
L'utilisation de #pragma pack
avec push et une valeur pour 'n', exécute le pragma pack push ou pragma pack push ident puis définit ensuite l'alignement en cours à 'n'.
#pragma pack utilisant pop
#pragma pack(pop)
L'utilisation de #pragma pack
avec pop extrait de la pile d'alignement et définit l'alignement en cours au dernier alignement placé dans la pile. Si le pop n'a pas de push correspondant, toute la pile d'alignement est sortie, un avertissement est émis et l'alignement revient à l'alignement de départ -aX.
#pragma pack utilisant pop, identifier
#pragma pop(pop, ident)
L'utilisation de #pragma pack
avec pop et un identificateur extrait de la pile jusqu'à avoir trouvé l'identificateur et définit l'alignement avec l'alignement placé par le #pragma pack(push, identifier)
précédent correspondant. Si le pop avec un identificateur ne trouve pas le push correspondant avec l'identificateur, toute la pile d'alignement est sortie, un avertissement est émis :
W8083: Pragma pack pop sans pack push correspondant
Puis l'alignement revient à l'alignement de départ -aX.
#pragma pack utilisant pop et n
#pragma pack(pop, 8) #pragma pack(pop, ident, 8)
L'utilisation de #pragma pack
avec pop et une valeur pour 'n', exécute pragma pack pop ou pragma pack pop identificateur. Ensuite l'alignement en cours est défini à 'n' sauf si pop n'a pas trouvé le push correspondant, dans ce cas 'n' n'est pas pris en compte, un avertissement est émis et l'alignement revient à l'alignement de départ -aX.
Conditions d'erreur
Spécifier un 'identificateur' sans push ou pop est une erreur.
Spécifier un alignement différent de 1, 2, 4, 8 ou 16 est une erreur.
Conditions d'avertissement
L'utilisation de #pragma pop
sans un push correspondant entraîne un avertissent.