【问题标题】:Conditional macro definition条件宏定义
【发布时间】:2014-04-11 18:29:59
【问题描述】:

我尝试了以下语法来定义宏:

#define SETBIT(ADDRESS,BIT,NEG)  #if NEG                    \
                                   (ADDRESS &= ~(1<<BIT))   \
                                 #else                      \
                                   (ADDRESS |= (1<<BIT))    \
                                 #endif

使用:

#define LED1 PORTA,1,1   \\ LED with anode to Vcc
#define LED2 PORTA,1,0   \\ LED with anode to GND
SETBIT(LED1)             \\ resulting in bit clear
SETBIT(LED2)             \\ resulting in bit set

我希望重点是明确的:我想只在一个地方指定端口极性,并使代码更具可读性和可扩展性。

但是 GCC 编译器抱怨它:

ipt.h:1: error: '#' 后面没有宏参数(第 30 列)

我发现#if 不允许在宏定义中使用。

我怎样才能用指定的函数声明宏?

【问题讨论】:

  • do{ if(NEG) (ADDRESS &amp;= ~(1&lt;&lt;&lt;BIT)); else (ADDRESS |= (1&lt;&lt;BIT));}while(0)
  • @BLUEPIXY 你能说清楚你为什么在这里使用 do-while 循环吗?
  • Roman,您似乎误解了预处理器指令。那些以# 开头的东西甚至在你的程序被编译之前就被发布了,所以绝对在像NEG 这样的变量意味着任何东西之前。使用#if 时,您要么必须使用像10 这样的整数常量,分别表示真和假;或像#define ASD 1 这样的宏定义,并使用ASD 代替1,依此类推...
  • 例如 if(condition)SETBIT(PORTA,1,1);else otherthing;被阻止,以免导致此错误。
  • @BLUEPIXY 的意思是将宏作为替换文本插入现有代码中,而不考虑含义。他给出的示例将通过创建两个 if 和两个 else 来搞砸。 do {} while(0) 技巧确保您的宏位于大括号内,但也允许将其作为语句插入。它可以去任何地方而不会弄乱现有的代码。这个技巧有效,因为“循环”将只执行一次。

标签: c gcc macros c-preprocessor avr


【解决方案1】:

试试这样的:

#define SETBIT(ADDRESS,BIT,NEG) \
  if (NEG)                      \
    (ADDRESS &= ~(1<<BIT));     \
  else                          \
    (ADDRESS |= (1<<BIT));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    相关资源
    最近更新 更多