4
#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'
4

3 回答 3

16

您需要定义LED_ON

#define LED_ON(x)  LED##x##_ON()

您想要获取参数x并粘贴在LED前缀和_ON后缀上。

于 2013-10-22T02:04:24.787 回答
0

我认为不应过度使用预处理器机制。如果一些更严重的逻辑开始出现在宏中,也许是时候切换到内联函数了?它们更具可读性,速度更快,功能更强大,并且在参数类型的情况下,您可以从编译器获得一些帮助......

如果您坚持#define LED_ON(x)宏并且后续的 LED 由一个端口的后续位控制,您可以尝试这样的事情:

#define LED_ON(x)   SetBit(port, 1<<x);
于 2013-10-21T22:30:46.323 回答
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()

于 2013-10-22T00:50:10.620 回答