这个函数是可重入的吗?

Is this function re-entrant?

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 的值没有改变,并且只发挥作用 return 它的地址。

是的。

来自 的标签摘录:

A subroutine is considered reentrant if it can be safely called before a previous call has completed.

在你的例子中,由于该函数只是 returns 全局(静态)变量的地址,该变量在程序启动后应保持不变,因此该函数可以很好地重入。

IMO,可重入函数可以访问全局和静态数据,无需更改任何,因此获取全局变量的地址是'对可重入函数来说很不错。

在考虑函数是否可重入时,这个例子必须比这个例子简单一点。

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

但是对DNMTemp(它的地址)的引用在程序执行期间将保持不变,所以这个函数是可重入的。

但是如果您访问任何真实数据,它不会。

uint32_t DNMManager_read(void)    //reentrant?
{
    return SerialNum;
}