我在理解宏时遇到了一些麻烦。
由于其专有代码,我无法共享确切的代码。因此,重命名和共享。
主要思想是服务器端代码监视通信(数据包)并设置一些状态位(以标记是否正确接收了数据)。
在其中一个代码流中,我遇到了嵌套的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替换。所以不确定在这里返回或设置什么。
很抱歉,如果信息不够。请询问是否需要更多信息。
谢谢
答案 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)
;
}
}