首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C宏,检查参数并由nop替换。

C宏,检查参数并由nop替换。
EN

Stack Overflow用户
提问于 2017-01-04 15:29:11
回答 3查看 262关注 0票数 0

我为我的单片机定义了一些用于GPIO切换的多级宏(并设置了模拟、数字等)。利用gcc。像这样

代码语言:javascript
复制
#define LED  B,2

gpio_make_amalog(LED) 
gpio_high(LED)
gpio_low(LED)

诸若此类。

问题是当我尝试重用代码时(就像最近的一个项目),我可能不会使用那个gpio,所以在每个模块中,我不得不去注释是不是没有定义LED。

代码语言:javascript
复制
//gpio_low(LED)

问题是,有可能测试宏中的宏参数,因此如果未定义LED,则插入Nop()。

提前谢谢你,

PS。

#ifdef不太实用。我最近的例子是4x4列键盘矩阵代码,最近我想使用3x4键盘手机类型)

所以我有很多if(gpio(COL1_ROW_4)) {}需要注释。

如果gpio()宏更聪明,nop将使代码保持无害。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-04 16:01:18

问题是,有可能测试宏中的宏参数,因此如果未定义LED,则插入Nop()。

有各种各样的有趣的游戏,你可以玩宏扩展,但没有真正的条件。所有严格基于宏的备选方案都围绕宏在不同的情况下进行不同的扩展。也许可以使用这样的技巧来实现您的目标,但即使是评估这是否可行,也需要更多地了解宏可以使用的值。

你应该考虑不同的方法。例如,您拒绝让您的宏定义以LED的定义为条件,等等,但我认为没有障碍使宏的使用取决于它们在调用中使用的宏的定义。也就是说,与您当前注释掉不想要的宏调用的做法不同,只需将它们一劳永逸地包装在适当的条件编译指令中:

代码语言:javascript
复制
#ifdef LED
gpio_make_amalog(LED);
#endif

#ifdef COL1_ROW_4
if (gpio(COL1_ROW_4)) {
    // ...
} 
#endif

..。甚至..。

代码语言:javascript
复制
if (
#ifdef COL2_ROW_2
    gpio(COL2_ROW_2)
#else
    0
#endif
) {
    // ...
} 

这将与注释掉所有这些调用一次一样多。

或者,如果您的使用涉及操作整个适用的引脚集,那么您可能会发现X宏方法很有用。

票数 2
EN

Stack Overflow用户

发布于 2017-01-04 15:34:30

在任何.h文件中尝试这一点,您确信这将包括在使用LED的地方.

代码语言:javascript
复制
#ifndef LED
#define GPIO_MAKE_ANALOG Nop()
#define GPIO_HIGH(A, B) Nop()
#define GPIO_LOW(A, B) Nop()
#endif

#ifdef LED
#define GPIO_MAKE_ANALOG gpio_make_analog(A, B)
#define GPIO_HIGH(A, B) gpio_high(A, B)
#define GPIO_LOW(A, B) gpio_low(A, B)
#endif
票数 1
EN

Stack Overflow用户

发布于 2017-01-04 15:36:57

您可以用USE_GPIO定义包装宏调用。

代码语言:javascript
复制
#ifdef USE_GPIO
#  define LED  B,2
#endif

#ifdef USE_GPIO
#  gpio_make_amalog(LED) 
#  gpio_high(LED)
#  gpio_low(LED)
#endif

然后在主文件中定义这个宏,之前包含头文件。这是一个特性测试宏。

但是,请注意,如果您正在进行模块化编译,并且此代码位于.c文件中,则需要在命令行中使用-D选项指定标志(假设为GCC)。

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

https://stackoverflow.com/questions/41467442

复制
相关文章

相似问题

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