C库如何存储状态变量?

das*_*man 5 c variables libraries

我已经在C中开发了一段时间,来自面向对象语言,如C++和Java,在使用像fread()和等标准库函数时strtok(),我开始怀疑:这些函数如何存储与状态相关的变量?

例如,strtok()对后续调用的行为不同,并fread()跟踪您在文件中的位置.这些信息必须存储在某个地方,并且在面向对象的语言中有范围构造,例如privateprotected保护这些值免受不必要的修改,但据我所知,C没有这些.

那么,它们如何安全存储?或者它们实际上是全球性的并且可以在任何地方修改?当我编写带有需要存储类似状态信息的实用程序函数的头文件时,问题就产生了.在C中执行此类操作的"正确"方法是什么,以及如何在现有库中处理?

Cli*_*ord 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 ) ;
}
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)


Mur*_*nik 7

这些调用使用static变量.本地静态变量在函数调用之间保留其值.全局静态变量或函数只能由同一文件中声明的其他函数访问.