首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >预处理宏替换

预处理宏替换
EN

Stack Overflow用户
提问于 2013-10-21 22:24:45
回答 3查看 7.2K关注 0票数 4
代码语言:javascript
复制
#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给出了错误消息:

代码语言:javascript
复制
undefined reference to `LEDx_ON'
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-22 02:04:24

您需要将LED_ON定义为

代码语言:javascript
复制
#define LED_ON(x)  LED##x##_ON()

您希望使用参数x并粘贴到LED前缀和_ON后缀上。

票数 17
EN

Stack Overflow用户

发布于 2013-10-21 22:30:46

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

如果您坚持使用#define LED_ON(x)宏和后续LED由一个端口的后续位控制,您可以尝试如下所示:

代码语言:javascript
复制
#define LED_ON(x)   SetBit(port, 1<<x);
票数 0
EN

Stack Overflow用户

发布于 2013-10-22 00:50:10

做这样的事

代码语言:javascript
复制
#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()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19505890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档