C语言中的函数如何保持其内部状态?
例如strtok()
-调用strtok(NULL, del)
时,该函数将继续处理前一个字符串。
答案 0 :(得分:3)
它包含用于跟踪事物的内部变量,声明为static
。这也是在多线程程序中不安全使用此类函数的原因。
答案 1 :(得分:2)
这是通过将局部变量声明为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
指针,用于跟踪您正在处理的字符串。