不均一な場合にコンパイラを救済する方法はありますsizeof (struct Astruct)
か?
背景情報: 16 ビットのマイクロプロセッサがあり、16 ビットの値が正しく整列されていない場合、プロセッサの整列エラーが発生します。これは、次のシナリオで発生する可能性があります。
typedef struct
{
U8BIT u8BitValue1;
U8BIT u8BitValue2;
U8BIT u8BitValue3;
} unevenAmountOf8BitValues;
typedef struct
{
U16BIT u16BitValue1;
U16BIT u16BitValue2;
} my16BitValues;
#define U8BIT_COUNT 3
#define U16BIT_COUNT 2
typedef struct
{
unevenAmountOf8BitValues u8BitValues;
my16BitValues u16BitValues;
} valuesCombined;
typedef union
{
valuesCombined myValues;
U8BIT buffer[sizeof(valuesCombined)];
struct
{
U8BIT bufferU8[U8BIT_COUNT];
U16BIT bufferU16[U16BIT_COUNT]; /* <<-- missalignment */
} valuesPerType;
} myValuesInRamAndRom
ここで行っているのは、U8BIT/U16BIT/U32BIT 値の量を手動でカウントし (まあ、Excel を使用して量を追跡します)、それをU(8/16/32)BIT_COUNT
定義に入れ、次に次のようにします。
#if U8BIT_COUNT % 2 == 1
#error The number of U8BIT parameters need to be even, add a dummy
#endif
U8-/U16-/U32BIT の値の量を追跡することは、かなりエラーが発生しやすく、1 時間後か何時間か後に「ああ、うまくいかない」と思う瞬間がかなりありました。くそー、定義する値の量を調整するのを忘れていました。
推奨される方法は sizeof 演算子を使用することですが、これはエラー チェックでは使用できないため、保持したいと考えています。
とにかく、sizeof 演算子を使用して、 U8BIT 値の量が偶数でなければならないという何らかの形式のエラー チェックを維持する方法はありますか?
LundinとAaron McDaidによる複合ソリューション:
#define COMPILE_TIME_ASSERT(expr) {typedef U8BIT COMP_TIME_ASSERT[((!!(expr))*2-1)];}