0

我在这里遇到的一个非常简单的问题。

我有一个全局变量的小宏,它在我的 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 指令?

4

4 回答 4

4

删除末尾的冒号:

#define get_uart_message_rec() uart_message_received;

因为它变成:

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

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

于 2013-02-24T16:46:21.490 回答
4
#define get_uart_message_rec() uart_message_received
                                                 // ^ no semicolon

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

于 2013-02-24T16:46:24.860 回答
3

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

if(get_uart_message_rec()==0)

到:

if(uart_message_received; ==0)

这应该会使编译器出错。

【写得太慢了!】

于 2013-02-24T16:47:01.210 回答
3

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

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

if(uart_message_received;==0)
于 2013-02-24T16:47:05.300 回答