Эта функция повторная? - PullRequest
       33

Эта функция повторная?

0 голосов
/ 19 января 2019

DNM_Manager.c

struct DNM_s
{
    uint32_t Addr;
    uint32_t SerialNum;
    uint32_t SubnetMask;
    uint16_t Tick;
    uint8_t Name[NAME_SIZE];
}DNMTemp;

pDNM DNMManager_New(void)    //reentrant?
{
    return &DNMTemp;
}

GeeksForGeeks говорит: чтобы быть реентерабельным, функция не может использовать глобальные и статические данные.

Я использую глобальные данные "DNMTemp" в этом случае. Однако значение DNMTemp не изменяется, и функция возвращает только свой адрес.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

При рассмотрении, является ли функция реентерабельной или нет, пример должен быть немного менее тривиальным, чем этот.

pDNM DNMManager_New(void)    //reentrant?
{
    return &DNMTemp;
}

Но ссылка на DNMTemp (его адрес) останется неизменной во время выполнения программы, поэтому эта функция реентерабельна.

Но если вы получите доступ к любым реальным данным, это не так.

uint32_t DNMManager_read(void)    //reentrant?
{
    return SerialNum;
}
0 голосов
/ 19 января 2019

Да.

Из отрывка тега :

Подпрограмма считается повторно входящей, если ее можно безопасно вызвать до завершения предыдущего вызова.

В вашем случае, поскольку функция возвращает только адрес глобальной (статической) переменной, которая должна оставаться постоянной после запуска программы, функция хорошо возвращается.

IMO, реентерабельная функция может получать доступ к глобальным и статическим данным, без изменения , поэтому получение адреса глобальной переменной неплохо для реентерабельной функции.

...