我为我的单片机定义了一些用于GPIO切换的多级宏(并设置了模拟、数字等)。利用gcc。像这样
#define LED B,2
gpio_make_amalog(LED)
gpio_high(LED)
gpio_low(LED)诸若此类。
问题是当我尝试重用代码时(就像最近的一个项目),我可能不会使用那个gpio,所以在每个模块中,我不得不去注释是不是没有定义LED。
//gpio_low(LED)问题是,有可能测试宏中的宏参数,因此如果未定义LED,则插入Nop()。
提前谢谢你,
PS。
#ifdef不太实用。我最近的例子是4x4列键盘矩阵代码,最近我想使用3x4键盘手机类型)
所以我有很多if(gpio(COL1_ROW_4)) {}需要注释。
如果gpio()宏更聪明,nop将使代码保持无害。
发布于 2017-01-04 16:01:18
问题是,有可能测试宏中的宏参数,因此如果未定义LED,则插入Nop()。
有各种各样的有趣的游戏,你可以玩宏扩展,但没有真正的条件。所有严格基于宏的备选方案都围绕宏在不同的情况下进行不同的扩展。也许可以使用这样的技巧来实现您的目标,但即使是评估这是否可行,也需要更多地了解宏可以使用的值。
你应该考虑不同的方法。例如,您拒绝让您的宏定义以LED的定义为条件,等等,但我认为没有障碍使宏的使用取决于它们在调用中使用的宏的定义。也就是说,与您当前注释掉不想要的宏调用的做法不同,只需将它们一劳永逸地包装在适当的条件编译指令中:
#ifdef LED
gpio_make_amalog(LED);
#endif
#ifdef COL1_ROW_4
if (gpio(COL1_ROW_4)) {
// ...
}
#endif..。甚至..。
if (
#ifdef COL2_ROW_2
gpio(COL2_ROW_2)
#else
0
#endif
) {
// ...
} 这将与注释掉所有这些调用一次一样多。
或者,如果您的使用涉及操作整个适用的引脚集,那么您可能会发现X宏方法很有用。
发布于 2017-01-04 15:34:30
在任何.h文件中尝试这一点,您确信这将包括在使用LED的地方.
#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发布于 2017-01-04 15:36:57
您可以用USE_GPIO定义包装宏调用。
#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)。
https://stackoverflow.com/questions/41467442
复制相似问题