4

普段はいい笑顔だけど、卑劣すぎて面白くない。構造体はファイルごとにどう違うのでしょうか?

私はこのような構造体を持っていました:

typedef struct pp_sig_s
{
          [...]
          int flags;
          size_t max;
          bool is_reversed;
        unsigned int sig[64];
          size_t byref;
          [...]
}
pp_sig_t;

「header01.h」と定義されていました私が使用する関数の一部は「program01.cpp」にありますこのように宣言されています

void PrintSig(pp_sig_t *s); // prints the content of sig[64] array in pp_sig_t for test purposes

g_sig_1 と呼ばれる別のオブジェクト pp_sig_t が「header02.cpp」で定義されました... この .cpp にはもちろん header01.h が含まれています

PrintSig(&g_sig_1);

印刷結果が実際の内容と異なることに気付きました。sig に 0xE8 が含まれているとすると、0xE800 が出力されます。

それから、2 時間ほど調査した結果、構造体のアライメントではないかと考えました。

やってみる...

header01.h でこのように構造体を宣言する

#pragma push()
#pragma pack(4)
typedef struct pp_sig_s
{
          [...]
          int flags;
          size_t max;
          bool is_reversed;
    unsigned int sig[64];
          size_t byref;
          [...]
}
pp_sig_t;
#pragma pop()

そして突然、すべてがうまくいきます...

したがって、基本的には、program01.cpp の構造体のオフセットが program02.cpp とは異なる場合に似ています...

ファイルごとに構造体がどのように異なるのでしょうか? プラグマを使用せずにこれを回避するにはどうすればよいでしょうか? コンパイラのバグと呼ぶことができますか (Linux で Intel C++ XE Composer 2013 Update 2 を使用しています)。

4

1 に答える 1

1

これは、ファイルの 1 つにヘッダーが含まれていたときにスコープ内にあったが、他のファイルには含まれていなかったアライメント プラグマが原因である可能性があります。

于 2013-05-15T22:54:55.053 に答える