#define LED1_ON() { /* twiddle port bit */ }
#define LED2_ON() { /* twiddle port bit */ }
// ...
#define LED9_ON() { /* twiddle port bit */ }
#define LED_ON(x) LED##x_ON()
我想使用上面的代码(或类似内容)来(例如)LED_ON(1)
调用宏LED1_ON()
或LED_ON(2)
调用宏LED2_ON()
。
我相信有可能让cpp这样做,但显然我没有正确的语法。有没有人知道使这成为可能的语法?
在我调用LED_ON(2)
的行上,gcc会显示错误消息:
undefined reference to `LEDx_ON'
答案 0 :(得分:14)
您需要将LED_ON
定义为
#define LED_ON(x) LED##x##_ON()
您想接受参数x
并粘贴LED
前缀和_ON
后缀。
答案 1 :(得分:0)
我认为不应该过度使用预处理器机制。如果一些更严重的逻辑开始出现在宏中,也许是时候切换到内联函数了?它们更具可读性,同样快速,功能更强大,如果参数类型为aso,您可以从编译器获得一些帮助。
如果您坚持#define LED_ON(x)
宏,后续LED由一个端口的后续位控制,您可以尝试这样的事情:
#define LED_ON(x) SetBit(port, 1<<x);
答案 2 :(得分:0)
做这样的事情
#define LED_ON(num) \
void LED_ON##num() \
{\
printf("set the bit for %d\n", num); \
}\
LED_ON(1)
LED_ON(2)
int main() {
LED_ON1();
LED_ON2();
}
LED_ON(1)和LED_ON(2)将扩展为全功能,名称为LED_ON1()和LED_ON2(),调用功能为LED_ON1()LED_ON2()