C union的大小(sizeof())是其最大元素的大小。
但是,是否有任何技巧可以找出可能是最小规模的联盟?
我的意思是如何实现MACRO的偏移......
答案 0 :(得分:3)
我看到有两种方法可以回答这个问题:
答案 1 :(得分:2)
如果我理解正确,你想要找到一个联合类型的最小成员的大小而不声明该类型的变量,而不参考成员的类型。获得成员大小的以下技巧可能会起作用,但有点狡猾的一面:
#define membersize(type, member) sizeof(((type *)0)->member)
您必须分别计算每个成员的大小以确定哪个是最小的,因此如果有人向联盟添加新成员,您将必须更改确定要占最小成员大小的代码它
答案 2 :(得分:2)
仅作为练习:
你可以做类似下面的事情
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <inttypes.h>
struct s1
{
uint8_t member;
uint8_t len;
};
struct s2
{
uint16_t member;
uint8_t len;
};
struct s3
{
uint32_t member;
uint8_t len;
};
typedef union u1
{
struct s1 m1;
struct s2 m2;
struct s3 m3;
}UNION_TEST;
#define RETRIEVE_MEMBER(memberNum) m##memberNum
#define test(unionName, memberName) offsetof(unionName, memberName.len)+sizeof(uint8_t)
int main(void)
{
printf("sizeof = %zu\n", test(UNION_TEST, RETRIEVE_MEMBER(1)));
printf("sizeof = %zu\n", test(UNION_TEST, RETRIEVE_MEMBER(2)));
printf("sizeof = %zu\n", test(UNION_TEST, RETRIEVE_MEMBER(3)));
}