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语言中允许使用空语句,因此代码>不是错误。