C 如何从工会内部推荐工会成员?

C 如何从工会内部推荐工会成员?,c,member,unions,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' u

我正在努力做到以下几点:

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)];

有没有一种方法可以从联合内部引用联合的成员?

C不允许这样做,
sizeof
的操作数必须是括号中的类型名(在您的示例中,
n
显然不是)或表达式(C语法中的一元表达式),联合的成员也不是

您可以执行以下操作之一,以避免硬编码大小:

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

在对另一个答案的评论中,您提到对齐问题是这样做的原因,因此您可能对此感兴趣:
malloc
等分配的内存总是适合所有类型的对齐。

C不允许您这样做,
sizeof
的操作数必须是括号中的类型名(你的例子中显然没有)或表达式(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];
    };
};

我喜欢这类东西的宏

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

谢谢mafso。这太难看了:)而且,内存是基于堆栈的,而不是基于堆的。但我不知道malloc的内存对所有类型都是对齐的。这是所有的类型,还是所有的积分类型?是否针对浮点或双精度对齐?C99 7.20.3 p1(与C11 7.22.3 p1略有不同)“如果分配成功,返回的指针将适当对齐,以便可以将其分配给指向任何类型对象的指针,然后用于访问分配空间中的此类对象或此类对象数组(直到空间被明确释放)。“因此,它必须针对
float
等对齐,例如
float*foo=malloc(sizeof*foo);
将是UB,否则,
malloc
不知道分配的存储将被分配什么指针类型,用C11术语来说,它必须分配一个具有基本对齐要求的对象。谢谢mafso。这很难看:)此外,内存是基于堆栈的,而不是基于堆的。但我不知道malloc的内存对所有类型都是对齐的。这是所有的类型,还是所有的积分类型?是否针对浮点或双精度对齐?C99 7.20.3 p1(与C11 7.22.3 p1略有不同)“如果分配成功,返回的指针将适当对齐,以便可以将其分配给指向任何类型对象的指针,然后用于访问分配空间中的此类对象或此类对象数组(直到空间被明确释放)。“因此,它必须针对
float
等对齐,例如
float*foo=malloc(sizeof*foo);
将是UB,否则,
malloc
不知道分配的存储将分配什么指针类型,用C11术语来说,它必须分配一个具有基本对齐要求的对象。