我正在尝试执行以下操作:
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)];
有没有办法从工会内部引用工会成员?
答案 0 :(得分:3)
C不允许你这样做,sizeof
的操作数必须是带括号的类型名称(n
显然不在你的例子中)或表达式(a <在C语法中的em> unary-expression ,其中union的成员也不是。
您可以执行以下操作之一,以便不对硬件进行硬编码:
unsigned char b[sizeof(union { unsigned int n[4]; })];
unsigned char b[sizeof(unsigned int[4])];
在对另一个答案的评论中,你提到了对齐问题是这样做的原因,所以也许你感兴趣的是:malloc
等分配的内存总是适合所有类型。
答案 1 :(得分:1)
我喜欢这类宏。
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];
};
};