Как обратиться к члену профсоюза внутри профсоюза?
Я пытаюсь сделать следующее:
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];
};
};