if-Condition中的C-Macro

时间:2013-02-24 16:44:10

标签: c macros

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

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

extern bool uart_message_received;
#define get_uart_message_rec() uart_message_received;

在我的C-File中,我想要访问这样的文件:

 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 个答案:

答案 0 :(得分:4)

删除结尾处的冒号:

#define get_uart_message_rec() uart_message_received;

因为它变成了:

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

当预处理器基本上找到/替换你的代码时。

答案 1 :(得分:4)

#define get_uart_message_rec() uart_message_received
                                                 // ^ no semicolon

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

答案 2 :(得分:3)

你的宏的末尾有一个分号 - 删除它,它会没事的。请注意,宏的确完全替换为写入,因此宏扩展为:

if(get_uart_message_rec()==0)

到:

if(uart_message_received; ==0)

应该使编译器出错。

[写得太慢了!]

答案 3 :(得分:3)

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

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

if(uart_message_received;==0)