我有这样的宏:
#define _DDR_0 DDRD
#define _DDR_1 DDRD
#define _DDR_2 DDRD
// ....
#define _PN_0 0
#define _PN_1 1
#define _PN_2 2
// ...
/** Configure pin as output */
#define as_output(pin) sbi(_DDR_##pin, _PN_##pin)
void as_output_n(const uint8_t pin);
它的使用方式如下:
as_output(2);
uint8_t b = 1;
as_output_n(b);
_n
变体用于变量,宏用于常量(因为使用宏执行此操作要快得多)。
是否有任何可能的方法来实现它,以便您可以始终使用 as_output
,并根据它是常量还是变量,使用宏或函数?
最佳答案
宏由预处理器扩展,预处理器不知道代码的作用。从预处理器的角度来看,所有宏参数都只是标记(没有逻辑意义)。在本例中,as_output
宏用于生成新代码(通过标记粘贴)。
所以,你想要做的事情,仅仅使用宏是不可能的(如果 b
本身就是一个宏,可能有一种方法,但我想这不是你想要的为)。
您可以使用 const 数组作为 _DDR*
和 PN*
值,并使用内联函数来代替宏。
关于c - 区分#define宏中的变量和常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30145219/