Понимание синтаксиса и функции макроса C - PullRequest
0 голосов
/ 22 февраля 2019

У меня возникли некоторые проблемы с пониманием макроса.

Так как его собственный код не может предоставить точный код.Таким образом, переименование и совместное использование.

Основная идея заключается в том, что код на стороне сервера контролирует обмен данными (пакеты данных) и устанавливает некоторые биты состояния (для отметки, если данные получены правильно).

В одномиз потока кода, я сталкиваюсь с вложенным циклом for, который использует макрос в конце каждой итерации 1-го цикла 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 голосов
/ 22 февраля 2019

#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)
                                                              ;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...