自動的に行うことは何もありませんが、あなたはsizeof
とoffsetof
を使用して、それらを組み合わせた順序が重要な方法で組み合わせることができます。ここでは一例です:あなたが見ることができるように
#include <stdio.h>
#include <stddef.h>
#define COMBINE2(a,b) ((a)*31+(b)*11)
#define COMBINE3(a,b,c) COMBINE2(COMBINE2(a,b),c)
#define COMBINE4(a,b,c,d) COMBINE2(COMBINE3(a,b,c),d)
typedef struct A {
int a1;
char a2;
float a3;
} A;
typedef struct B {
int b1;
char b2;
double b3;
} B;
typedef struct C {
char c2;
int c1;
float c3;
} C;
typedef struct D {
int d1;
char d2;
float d3;
int forgotten[2];
} D;
int main(void) {
size_t aSign = COMBINE4(sizeof(A), offsetof(A,a1), offsetof(A,a2), offsetof(A,a3));
size_t bSign = COMBINE4(sizeof(B), offsetof(B,b1), offsetof(B,b2), offsetof(B,b3));
size_t cSign = COMBINE4(sizeof(C), offsetof(C,c1), offsetof(C,c2), offsetof(C,c3));
size_t dSign = COMBINE4(sizeof(D), offsetof(D,d1), offsetof(D,d2), offsetof(D,d3));
printf("%ld %ld %ld %ld", aSign, bSign, cSign, dSign);
return 0;
}
このコードprints
358944 478108 399864 597272
、このコードは異なる長さと変化の分野の再順序付けに反応する各構造のための実行時定数を生成しますフィールドの型。また、計算の基礎となるフィールドのリストを更新することを忘れても、フィールドを追加することに反応します。これにより、何らかの安全ネットが生成されるはずです。
これに関連するすべてのMS? – ouah
例を追加 –
ありがとうございました。私はsizeofを使用することを考えましたが、移動されたフィールドや以前に見られたサイズになるその他の操作を防ぐことはできません。 Windows APIの場合は、フィールドの追加だけを変更することを制限するのは良い考えですが、現在はそれほど遠くに行きたくはありません。 –