c - 区分#define宏中的变量和常量

标签 c gcc macros avr

我有这样的宏:

#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/

相关文章:

linux - Fedora 17 的 PATH 变量中缺少 GCC

C++ 创建一个沿所有文件递增的计数器宏

c - 打开简历。如何将点和矩阵相乘 (CvMat)

c++ - 链接 UnitTest++ 失败

c - 编写一个 C 程序来计算线性方程组中 x 和 y 的解

我可以在 C 中执行类似 #define ARRAY(size) char[##size##] 的操作吗?

c - 如何使用命令行选项覆盖 __TIME__ 和 __DATE__ 宏的值?

c++ - #undef C++ 的作用域

c++ - 对 printf 使用 #define,它对速度有影响吗

c - 将 int 的每个数字分配给 int 数组