在C预处理器中创建一个结构

时间:2018-02-27 22:38:09

标签: c c-preprocessor

现在,我正在用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 */

首先,这是可行的吗?如果是的话,我该怎么做呢?如果没有,我可以使用另一种方法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

是的,可能,您的代码非常接近正确。

我在宏定义的末尾删除了分号。我也放弃使用typeof;它不可移植,除非你想使用表达式而不是类型名称作为create_union的第一个参数,否则不需要它。

这是我可能如何定义的。 (我不打算使用typedef来获取struct或union类型;我只使用名称struct foounion 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;