Как обратиться к члену профсоюза внутри профсоюза?

Я пытаюсь сделать следующее:

struct AlignedBuffer {
    union
    {
        unsigned int n[4];
        unsigned char b[sizeof(n)];
    };
};

Его производство:

$ gcc -g3 -O1 -std=c99 -Wall -Wextra test.c -o test.exe
test.c:13:32: error: use of undeclared identifier 'n'
        unsigned char b[sizeof(n)];

Есть ли способ ссылаться на членов профсоюза внутри профсоюза?

2 ответа

Решение

С не позволяет вам сделать это, операнд sizeof должно быть либо имя типа в скобках (которое n явно не в вашем примере) или выражение (унарное выражение в грамматике C), которое также не является членом союза.

Вы можете выполнить одно из следующих действий, чтобы не указывать размер кода жестко:

unsigned char b[sizeof(union { unsigned int n[4]; })];
unsigned char b[sizeof(unsigned int[4])];

В комментарии к другому ответу вы упомянули проблемы выравнивания в качестве причины для этого, так что, возможно, это представляет для вас некоторый интерес: malloc и т. д. всегда подходит для всех типов.

Мне нравятся макросы для такого рода вещей.

typedef unsigned int my_number_t;
#define HOW_MANY_N 4
#define SIZE_OF_N sizeof(my_number_t)

struct AlignedBuffer {
    union
    {
        my_number_t n[HOW_MANY_N];
        unsigned char b[SIZE_OF_N * HOW_MANY_N];
    };
};

Или, возможно, для большей ясности и большей полезности,

typedef unsigned int my_number_t;
#define SIZE_OF_N sizeof(my_number_t)
#define SIZE_OF_ALIGNED_BUFFER 16
#define HOW_MANY_N (SIZE_OF_ALIGNED_BUFFER / SIZE_OF_N)

struct AlignedBuffer {
    union
    {
        my_number_t n[HOW_MANY_N];
        unsigned char b[SIZE_OF_ALIGNED_BUFFER];
    };
};
Другие вопросы по тегам