2013-08-06 41 views
3

我有一个局部变量的函数是静态的&常量,函数是否是可重入的?具有常量和静态局部变量的函数,使函数重入?

这是代码:

void foo(unsigned char *pucBuffer, 
     int   iBytes, 
     unsigned int *puiOUT) 
{ 
    static const long rg_uliLUT[4] = {0x00000000, 0x77073096, 0xee0e612c, 
            0x990951ba}; 
    while(iBytes--) 
    { 
    *puiOUT = (*puiOUT >> 8)^rg_uliLUT[(*puiOUT & 0x03)^*pucBuffer++]; 
    } 
} 

预先感谢您:d

+0

不,这是因为const不强制不可变性。 –

+2

@Manoj:当然'const'确实强制不变性?!有一些“黑客”可以绕过它(例如,将地址和转换为非const指针),但假设没有有趣的业务,程序不能更改const变量。 – Jimbo

+0

@Jimbo - 我的意思是一样的。 –

回答

2

只要rg_uliLUTconst然后是的,我认为你的函数重入。如果该变量不是const并且被修改,那么答案将是否定的,但是因为它是恒定的,所以调用者将不能修改另一个调用者的状态变量(任何可以改变的东西都在调用者的私有堆栈上并且唯一的“共享的“数据不能改变)。

从好老wikipedia

在计算,一个计算机程序或子程序调用折返如果 它可以在其执行过程中被中断,然后安全地 再次调用(“重新输入”)在其前一次调用完成之前执行 。

所有的函数状态对每个调用者都是私有的(在调用者堆栈上)。唯一的另一个状态是不变的,因为调用者不能修改它,对于任何其他调用者,它总是看起来是相同的,所以如果两个线程同时在函数中时不会改变函数行为。

PS:如果puiOUT指向的内存在调用者之间共享,则不可重入。也好像pucBuffer可能是char const *,因为它没有写入。

相关问题