如何从工会内部引用工会成员?

时间:2014-09-13 23:52:29

标签: c member unions

我正在尝试执行以下操作:

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 个答案:

答案 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];
    };
};