使用C预处理器生成样板代码
目前我正在编写一些易于扩展的代码。 要添加新条目,用户必须添加:使用C预处理器生成样板代码,c,c-preprocessor,C,C Preprocessor,目前我正在编写一些易于扩展的代码。 要添加新条目,用户必须添加: 新条目的名称 新条目的大小 名称仅用于填充枚举,大小用于保留一些空间来存储枚举的值 坦率地说,我甚至不确定这是否可行,因为我实际上是在问预处理器是否可以正确地分割/分离符号,并将其转换为某种样板代码 例如,我想添加以下条目: DECLARE_ENTRY(downlinkCounter, sizeof(uint32_t)) DECLARE_ENTRY(uplinkCounter, sizeof(uint32_t)) 或许: #de
DECLARE_ENTRY(downlinkCounter, sizeof(uint32_t))
DECLARE_ENTRY(uplinkCounter, sizeof(uint32_t))
或许:
#define ENTRIES downlinkCounter, sizeof(uint32_t), uplinkCounter, sizeof(uint32_t)
或:
(最后一个选项不是首选,我更喜欢将名称和大小紧密配对)
我希望在头文件中扩展到以下内容:
typedef enum {
downlinkCounter,
uplinkCounter,
} eEntries_t;
要在源文件中展开到该位置,请执行以下操作:
typedef struct {
uint8_t downlinkCounter[sizeof(uint32_t)];
uint8_t uplinkCounter[sizeof(uint32_t)];
} sEntries_t;
我甚至可以用C预处理器来做这个吗?还是我要把这个打印出来
谢谢你的帮助 最好在编译之前运行一些C代码生成脚本,以便获得清晰可读的代码 否则,可以使用各种宏技巧(即所谓的“X宏”)集中处理前常量。它们有助于避免代码重复,但会使所有内容变得难以阅读。在这种情况下:
#define ENTRY_LIST(X) \
X(downlinkCounter, sizeof(uint32_t)) \
X(uplinkCounter, sizeof(uint32_t)) \
然后可以使用各种宏调用此列表以生成特定的代码段:
#define ENTRY_ENUM(name, dummy) name,
typedef enum {
ENTRY_LIST(ENTRY_ENUM)
} eEntries_t;
#define ENTRY_STRUCT(name, size) uint8_t name[size];
typedef struct {
ENTRY_LIST(ENTRY_STRUCT)
} sEntries_t;
预处理为:
typedef enum {
downlinkCounter,
uplinkCounter,
} eEntries_t;
typedef struct {
uint8_t downlinkCounter[sizeof(uint32_t)];
uint8_t uplinkCounter[sizeof(uint32_t)];
} sEntries_t;
预处理器相当愚蠢。最好用脚本语言进行预构建处理。考虑使用等等。要生成你想要的C代码,那么答案似乎是否定的?
typedef enum {
downlinkCounter,
uplinkCounter,
} eEntries_t;
typedef struct {
uint8_t downlinkCounter[sizeof(uint32_t)];
uint8_t uplinkCounter[sizeof(uint32_t)];
} sEntries_t;