我已经在C中开发了一段时间,来自面向对象的语言,如C ++和Java,在使用fread()
和strtok()
等标准库函数时,我开始怀疑:这些函数如何存储与其状态相关的变量?
例如,strtok()
对后续调用的行为有所不同,fread()
会跟踪您在文件中的位置。这些信息必须存储在某个地方,并且在面向对象的语言中有一些范围构造,例如private
或protected
来保护这些值免受不必要的修改,但据我所知,C没有这些
那么,他们如何安全存储?或者它们实际上是全球性的并且可以在任何地方修改?当我编写带有需要存储类似状态信息的实用程序函数的头文件时,问题就产生了。在C中做这种事情的“正确”方法是什么,以及如何在现有的库中处理它?</ p>
答案 0 :(得分:8)
在fread()的情况下,状态存储在FILE结构中。该结构是由fopen()
分配的资源,它返回指向它的指针,并将该指针传递给每个文件操作调用。调用fclose()
时将释放资源。 FILE资源可以从静态池分配,也可以从堆中动态分配 - 这取决于实现。例如:
RESOURCE* getResource()
{
return malloc( sizeof(RESOURCE) ) ;
}
int useResource( RESOURCE* r )
{
return r.index++ ;
}
void releaseResource( RESOURCE* r )
{
free( r ) ;
}
另一方面, strtok()
包含一个内部静态指针,该字符串在传递字符串时初始化,并在传递空指针时用作起始点。
例如:
int getState()
{
static int state = 0 ;
return state++ ;
}
int main()
{
int s ;
do
{
s = getState() ;
printf( "state = %d\n", s ;
} while( s < 10 ) ;
}
答案 1 :(得分:7)
这些调用使用static
个变量。本地静态变量在函数调用之间保留其值。全局静态变量或函数只能由同一文件中声明的其他函数访问。