函数在 C 中维护内部状态
Function maintains internal state in C
C 中的函数如何保持其内部状态?
例如 strtok()
- 当调用 strtok(NULL, del)
时,该函数继续处理之前的字符串。
它包含用于跟踪事物的内部变量,声明为static
。这也是为什么在多线程程序中使用此类函数不安全的原因。
这是通过将局部变量声明为 static
:
来完成的
unsigned int some_state_function( void )
{
static unsigned int internal_state = 0; // keeps track of the number
... // of times the function has been
return internal_state++; // called - useless, but illustrative
}
变量internal_state
有static
存储时间,这意味着它的存储空间在程序启动时分配并初始化,并一直保留到程序终止;它的生命周期超出了函数的生命周期。在这种情况下,初始化是多余的(static
对象被初始化为 0
或等价物),但它是为了说明概念 - 初始化发生一次,在程序启动时,而不是在调用函数时.
然而,标识符 internal_state
是 some_state_function
的局部变量——它在函数外是不可见的。
strtok
做类似的事情 - 它有一个本地 static
指针,用于跟踪您正在处理的字符串。
C 中的函数如何保持其内部状态?
例如 strtok()
- 当调用 strtok(NULL, del)
时,该函数继续处理之前的字符串。
它包含用于跟踪事物的内部变量,声明为static
。这也是为什么在多线程程序中使用此类函数不安全的原因。
这是通过将局部变量声明为 static
:
unsigned int some_state_function( void )
{
static unsigned int internal_state = 0; // keeps track of the number
... // of times the function has been
return internal_state++; // called - useless, but illustrative
}
变量internal_state
有static
存储时间,这意味着它的存储空间在程序启动时分配并初始化,并一直保留到程序终止;它的生命周期超出了函数的生命周期。在这种情况下,初始化是多余的(static
对象被初始化为 0
或等价物),但它是为了说明概念 - 初始化发生一次,在程序启动时,而不是在调用函数时.
然而,标识符 internal_state
是 some_state_function
的局部变量——它在函数外是不可见的。
strtok
做类似的事情 - 它有一个本地 static
指针,用于跟踪您正在处理的字符串。