了解C宏的语法和功能

时间:2019-02-22 13:43:36

标签: c

我在理解宏时遇到了一些麻烦。

由于其专有代码,我无法共享确切的代码。因此,重命名和共享。

主要思想是服务器端代码监视通信(数据包)并设置一些状态位(以标记是否正确接收了数据)。

在其中一个代码流中,我遇到了嵌套的for循环,该循环在第一个for循环的每次迭代结束时使用一个宏:

for( msg_no=0U; msg_no<packet_num; msg_no++ )
{
    for( rec_no=0U; rec_no<current_rec_number ; rec_no++ )
    {
        SetError( ERROR_COMM_01_FAILURE, current_rec_number, 
                ( current_rec_number<=TOTAL_RECORD_NUM )?0:1 );
    }
}

每个变量的当前值(来自调试会话)如下:

packet_num = 1
ERROR_COMM_01_FAILURE = 0 ( --> #define ERROR_COMM_01_FAILURE 0 )
current_rec_number = 0
TOTAL_RECORD_NUM = 8 ( --> #define TOTAL_RECORD_NUM 8 )

宏定义如下:

#define SetError(temp_1, temp_2, temp_3)    (temp_1)

我不确定使用此宏设置了什么,或者该宏如何运行。此处的第一个参数是temp_1,由ERROR_COMM_01_FAILURE替换。所以不确定在这里返回或设置什么。

很抱歉,如果信息不够。请询问是否需要更多信息。

谢谢

1 个答案:

答案 0 :(得分:2)

#define SetError(temp_1, temp_2, temp_3) (temp_1)得到3个参数,仅产生()之间的第一个参数

如此

for( msg_no=0U; msg_no<packet_num; msg_no++ )
{
    for( rec_no=0U; rec_no<current_rec_number ; rec_no++ )
    {
        SetError( ERROR_COMM_01_FAILURE, current_rec_number, 
                ( current_rec_number<=TOTAL_RECORD_NUM )?0:1 );
    }
}

实际上是

for( msg_no=0U; msg_no<packet_num; msg_no++ )
{
    for( rec_no=0U; rec_no<current_rec_number ; rec_no++ )
    {
        ( ERROR_COMM_01_FAILURE );
    }
}

如果您有gcc / g ++,则可以使用-E选项在预处理后查看结果

/tmp % cat m.c
#define SetError(temp_1, temp_2, temp_3)    (temp_1)

for( msg_no=0U; msg_no<packet_num; msg_no++ )
{
    for( rec_no=0U; rec_no<current_rec_number ; rec_no++ )
    {
        SetError( ERROR_COMM_01_FAILURE, current_rec_number, 
                ( current_rec_number<=TOTAL_RECORD_NUM )?0:1 );
    }
}
/tmp % gcc -E m.c
# 1 "m.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "m.c"


for( msg_no=0U; msg_no<packet_num; msg_no++ )
{
    for( rec_no=0U; rec_no<current_rec_number ; rec_no++ )
    {
        (ERROR_COMM_01_FAILURE)
                                                              ;
    }
}