【问题标题】:C-Macro in if-Conditionif条件下的C宏
【发布时间】:2013-02-25 00:47:05
【问题描述】:

我这里有一个很简单的问题。

我有一个全局变量的小宏,它在我的 Header 中定义,如下所示:

extern bool uart_message_received;
#define get_uart_message_rec() uart_message_received;

在我的 C 文件中,我想像这样访问文件:

 bool uart_message_received = 0;
 void foo(void)
 {
       bool test;
       test = get_uart_message_rec();  // Works fine

       if(get_uart_message_rec()==0)    // Doesn't work
       {
          //...
       } 
 }

我有点困惑为什么if 中的条件不起作用。是我做错了什么,还是违反了某些 C 指令?

【问题讨论】:

  • “不起作用”是什么意思?而且,你为什么使用宏而不是函数?

标签: c macros


【解决方案1】:
#define get_uart_message_rec() uart_message_received
                                                 // ^ no semicolon

宏替换将按原样替换文本,包括您的情况下的;。这将导致 if 情况下的语法错误。

【讨论】:

  • 好的,我本来可以考虑一下的——谢谢。 - 这意味着当我用双冒号写test = get_uart_message_rec(); 时,它实际上是test = get_uart_message_rec();;(没关系).. ?
  • 没错。 C 中允许空语句,所以;; 不是错误。
【解决方案2】:

去掉末尾的冒号:

#define get_uart_message_rec() uart_message_received;

因为它变成了:

if(**uart_message_received;**==0)    // Doesn't work
{
    //...
} 

当预处理器基本上确实在您的代码上查找/替换时。

【讨论】:

    【解决方案3】:

    您的宏末尾有一个分号 - 删除它就可以了。请注意,宏确实替换了所写的内容,因此您的宏扩展自:

    if(get_uart_message_rec()==0)
    

    到:

    if(uart_message_received; ==0)
    

    这应该会导致编译器错误。

    [写得太慢了!]

    【讨论】:

      【解决方案4】:

      这是因为你在宏的末尾有一个分号。

      宏被替换原样,在实际编译器看到文本之前,所以替换后的语句如下所示:

      if(uart_message_received;==0)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-25
        • 2017-04-18
        • 1970-01-01
        相关资源
        最近更新 更多