Share via


pack

指定封裝的結構、 等位,以及類別成員的對齊方式。

#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n  )

備註

pack可讓控制項在資料宣告層級。 這點不同於編譯器選項 /Zp,它只提供模組層級的控制項。 pack開始生效的第一次struct, union,或class宣告後會看到 pragma。 pack不沒有定義任何作用。 呼叫pack沒有引數集與n的編譯器選項在設定的值為**/Zp**。 如果未設定編譯器選項,則預設值為 8。

如果您變更結構的對齊方式,它可能使用的空間中的記憶體,但是您可能會發現效能降低,或取得硬體所產生的例外狀況,以未對齊的存取。 您可以修改此例外狀況行為使用 SetErrorMode

  • show(選擇性)
    顯示目前的壓縮對齊方式的位元組值。 這個值會顯示警告訊息。

  • push(選擇性)
    內部編譯器堆疊,並將目前的封裝對齊值的集合上的推入目前的封裝對齊值n。 如果n未指定,則目前的壓縮對齊值推入。

  • pop(選擇性)
    編譯器內部堆疊的頂端會移除資料錄。 如果n未指定pop,則產生的記錄堆疊的頂端與相關的封裝值是新的壓縮對齊值。 如果n指定,例如, #pragma pack(pop, 16), n會變成新的壓縮對齊值。 如果您使用快顯identifier,例如, #pragma pack(pop, r1),那麼所有的記錄,在堆疊上取出才有的資料錄identifier找不到。 在取出資料錄,並與產生的記錄,在上面的相關的封裝值是堆疊新的封裝對齊值。 如果您使用快顯identifier ,中找不到任何記錄,在堆疊上,然後在pop會被忽略。

  • identifier(選擇性)
    搭配使用時push,將名稱指派給內部編譯器堆疊上的資料錄。 搭配使用時pop,直到內部堆疊的記錄會顯示identifier會被移除。 如果identifier中找不到內部堆疊中,執行任何動作被取出。

  • n (選擇項)
    指定一個值,以位元組為單位,以便進行封裝。 如果編譯器選項 /Zp 尚未設定模組,也就是預設值為n為 8。 有效值為 1、 2、 4、 8 和 16。 成員的對齊方式會在可能的界限上對齊之n或成員大小的倍數兩者中較小。

#pragma pack(pop,identifier, n)未定義。

如需有關如何修改對齊方式的詳細資訊,請參閱下列主題:

範例

下列範例示範如何使用pack pragma,以變更結構的對齊方式。

// pragma_directives_pack.cpp
#include <stddef.h>
#include <stdio.h>

struct S {
   int i;   // size 4
   short j;   // size 2
   double k;   // size 8
};

#pragma pack(2)
struct T {
   int i;
   short j;
   double k;
};

int main() {
   printf("%d ", offsetof(S, i));
   printf("%d ", offsetof(S, j));
   printf("%d\n", offsetof(S, k));

   printf("%d ", offsetof(T, i));
   printf("%d ", offsetof(T, j));
   printf("%d\n", offsetof(T, k));
}

0 4 8
0 4 6

下列範例示範如何使用pushpop,以及show語法。

// pragma_directives_pack_2.cpp
// compile with: /W1 /c
#pragma pack()   // n defaults to 8; equivalent to /Zp8
#pragma pack(show)   // C4810
#pragma pack(4)   // n = 4
#pragma pack(show)   // C4810
#pragma pack(push, r1, 16)   // n = 16, pushed to stack
#pragma pack(show)   // C4810
#pragma pack(pop, r1, 2)   // n = 2 , stack popped
#pragma pack(show)   // C4810

請參閱

參考

Pragma 指示詞 」 和 「 __Pragma 關鍵字