现在,我正在用C编写一个小项目来测试一些序列化技术。 我这样做的一种方式是通过使用工会。我想尝试的是在C预处理器中创建一个包含用户定义结构的联合。例如,像这样:
#define create_union(name_of_structure, type_of_structure) \
\
typedef union name_of_structure { \
typeof(type_of_structure) structure; \
char buffer_that_holds_structure[sizeof(type_of_structure)]; \
} name_of_structure;
/* Usage */
struct my_data {
int id;
int other_value;
};
create_union(my_data_t, struct my_data);
/* Data type my_data_t (union my_data_t) now exists */
首先,这是可行的吗?如果是的话,我该怎么做呢?如果没有,我可以使用另一种方法吗?
谢谢!
答案 0 :(得分:2)
是的,可能,您的代码非常接近正确。
我在宏定义的末尾删除了分号。我也放弃使用typeof
;它不可移植,除非你想使用表达式而不是类型名称作为create_union
的第一个参数,否则不需要它。
这是我可能如何定义的。 (我不打算使用typedef来获取struct或union类型;我只使用名称struct foo
或union foo
,除非该类型是完全不透明的。如果你愿意,可以随意使用typedef更喜欢。)(我还使用了unsigned char
而不是char
,因为这是如何定义对象表示的。)
#define CREATE_UNION(new_type, existing_type) \
union new_type { \
existing_type obj; \
unsigned char rep[sizeof(existing_type)]; \
}
然后你可以这样做:
CREATE_UNION(int_wrapper, int);
int_wrapper foo;
请注意,您定义的是联合,而不是结构。
答案 1 :(得分:-1)
也许这就是你要找的东西?
#define LLI_DECLARE \
NODE_DECLARE \
struct lli_s *lli_next;
#define NODE_DECLARE \
uint16_t nm_gmagic; \
uint16_t nm_handle;
struct lli_s
{
LLI_DECLARE
};
typedef struct lli_s lli_t;