【发布时间】:2020-04-01 16:03:18
【问题描述】:
我想要一个(或多个)C 宏,它可以用于两个目的:
- 声明一个常量变量。
- 将该变量添加到数组中。
即,如果我有这个
typedef struct {
int port;
int pin;
} pin_t;
这样的宏
#define DEFINE_PIN(name, port, num)
应该扩展成这样的东西
#define NAME port, num
const pin_t[] = {
{NAME}
};
并且每个定义都应该将新定义的变量附加到数组中。
我知道#define 不能扩展到#defines,而只是一个说明。我想要完成的是,一方面,定义必要时使用的引脚,另一方面,有一种简单的方法来遍历所有引脚,即配置硬件 gpios。
【问题讨论】:
-
如果您使用
gcc,gcc -E <file.c>是测试宏扩展的好方法,因为它只运行文件<file.c>上的预处理器步骤。请注意,包含也会被扩展,因此您可能会暂时删除它们。 -
我可以向this question 提出我的答案的变体。如果您需要,我可以根据您的情况定制该解决方案,但可能没有必要。优点:与下面的答案相比,它不需要 position 字段。并且人口是在初始化时完成的。缺点:有人可能觉得它不优雅。但它目前用于大型项目。
-
如果你有一个聪明的编译器,你可以做一些看起来很愚蠢的事情:只需创建一个大的
const引脚数组,每个条目都有一个字符串成员给出它的名称,然后编写一个函数,给定一个字符串,搜索数组并返回具有该名称的引脚。如果您启用内联并使用字符串文字调用搜索函数,那么像 gcc 这样的优秀编译器会优化整个事情并将其减少到适当的常量。 Example.
标签: c macros c-preprocessor