Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
if条件下的C宏_C_Macros - Fatal编程技术网

if条件下的C宏

if条件下的C宏,c,macros,C,Macros,我这里有一个很简单的问题 我有一个全局变量的小宏,它在我的标题中定义如下: extern bool uart_message_received; #define get_uart_message_rec() uart_message_received; bool uart_message_received = 0; void foo(void) { bool test; test = get_uart_message_rec(); // Works fine

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

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

extern bool uart_message_received;
#define get_uart_message_rec() uart_message_received;
 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(uart_message_received;==0)
在我的C文件中,我希望访问如下文件:

extern bool uart_message_received;
#define get_uart_message_rec() uart_message_received;
 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(uart_message_received;==0)

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

删除以下命令末尾的冒号:

#define get_uart_message_rec() uart_message_received;
因为它变成:

if(**uart_message_received;**==0)    // Doesn't work
{
    //...
} 
当预处理器基本上对代码进行查找/替换时

#define get_uart_message_rec() uart_message_received
                                                 // ^ no semicolon

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

如果宏末尾有分号,请删除该分号,这样就可以了。请注意,宏的替换方式与写入的方式完全相同,因此宏将从以下位置展开:

if(get_uart_message_rec()==0)
致:

这将导致编译器出错


[写得太慢了!]

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

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

extern bool uart_message_received;
#define get_uart_message_rec() uart_message_received;
 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(uart_message_received;==0)

你说“不行”是什么意思?还有,你为什么用宏而不是函数?好的,我真的可以考虑一下-谢谢这意味着在我编写
test=get\u uart\u message\u rec()时其实际
test=get_uart_message_rec()带双冒号(这无关紧要)?确切地C语言中允许使用空语句,因此
不是错误。