-2

X マクロ内での offsetof() の使用における明らかなエラーに困惑しています。以下のコードは、かなり単純な構造の 2 つの例を示しています。1 つは明示的に定義され、もう 1 つは X マクロを使用して定義されています。次に、両方の構造内の各構造フィールドのオフセットが画面に出力されます。以下のコメントでわかるように、X マクロで定義された構造体のcフィールドは、正しくないオフセットを示しています。

これは印刷の問題だと思います。誰かこの謎に光を当ててくれませんか?

#include <stdio.h>
#include <stdlib.h>

const char fmt[] = "%-5s 0x%04x(%05d)\n";

#define i(s, f) \
    #f, \
    offsetof(s, f), \
    offsetof(s, f)

int main(void)
{
    /**********************************
    METHOD1 - CORRECTLY PRINTS

        a     0x0000(00000)
        b     0x0004(00004)
        c     0x0008(00008)
        d     0x0030(00048)

    **********************************/
    typedef struct {
        uint32_t a;
        uint32_t b;
        uint32_t c[10];
        uint32_t d;
    } struct1;

    printf(fmt, i(struct1, a));
    printf(fmt, i(struct1, b));
    printf(fmt, i(struct1, c));
    printf(fmt, i(struct1, d));

    printf("\n");

    /**********************************
    METHOD2 - PRINTS WRONG INFO

        a     0x0000(00000)
        b     0x0004(00004)
        c[10] 0x0030(00048)  <== WRONG
        d     0x0030(00048)

    **********************************/

    #define FIELDS \
        X(uint32_t, a,     "") \
        X(uint32_t, b,     "") \
        X(uint32_t, c[10], "") \
        X(uint32_t, d,     "") \

    typedef struct {
    #define X(type, name, descr) type name;
        FIELDS
    #undef X
    } struct2;

    #define X(type, name, descr) printf(fmt, i(struct2, name));
        FIELDS
    #undef X

    return 0;
}
4

2 に答える 2