C400

117. typedef で不可解なエラーに陥ったら ?!

  typedef struct { 
    char opn_type; 
    char file[10]; 
     :
   } S38OPFBK;
   S38OPFBK m_S38OPFBK;

    :
   memcpy(memcpy(&m_S38OPFBK, &buff4[10], sizeof(S38OPFBK));

などのように typedef で定義されている変数に
memcpy で変数 buff などをコピーすると typedef の要素の値が
おかしくなってしまったようなことはないだろうか ?

これは CRTBNDC のコンパイラーのバグというかミスであり
コンパイラーは typedef を見つけると typedef の各要素どうしの
あいだに 1桁のスペースを挿入してしまう問題を持っている。
そのためバッファー全体を typedef に上書きでコピーすると
各要素の値が期待したものとは異なってしまうのである。

これに気づかないと相当、頭を抱えてしまうことになるのだが
幸い、解決方法はある。

#pragma pack(1) 〜 #pragma pack(reset) で typedef を囲んで
次のように定義するとよい。

  
  #pragma pack(1)
   typedef struct { 
    char opn_type; 
    char file[10]; 
     :
   } S38OPFBK;
   S38OPFBK m_S38OPFBK;
   #pragma pack(reset)

… これによってコンパイラーが typedef のあいだにスペースを
挟むバグはなくなる。
このことは IBM マニュアルには明示されていないかも知れない。