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