c:静态结构

C: static struct

本问题已经有最佳答案,请猛点这里访问。

我对C还比较陌生,正在研究一些代码来学习散列。

我遇到一个包含以下代码行的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

#include <time.h>
#include <sys/time.h>

// ---------------------------------------------------------------------------

int64_t timing(bool start)
{
    static      struct timeval startw, endw; // What is this?
    int64_t     usecs   = 0;

    if(start) {
        gettimeofday(&startw, NULL);
    }
    else {
        gettimeofday(&endw, NULL);
        usecs   =
               (endw.tv_sec - startw.tv_sec)*1000000 +
               (endw.tv_usec - startw.tv_usec);
    }
    return usecs;
}

我从来没有遇到过用这种方式定义的静态结构。通常结构前面是结构的定义/声明。然而,这似乎只是说明将有类型为timeval、startw、endw的静态结构变量。

我试着读懂这是怎么回事,但还没有找到一个足够好的解释。有什么帮助吗?


struct timeval是在sys/time.h中某处声明的结构。您突出显示的那一行声明了两个静态变量,名为startwendw,类型为struct timevalstatic关键字适用于声明的变量,而不是结构(类型)。

您可能更习惯使用具有typedef的名称的结构,但这不是必需的。如果声明这样的结构:

1
struct foo { int bar; };

然后您声明(并在这里定义)一个名为struct foo的类型。只要您想声明该类型的变量(或参数),就需要使用struct foo。或者使用typedef给它另一个名称。

1
2
3
4
5
6
7
foo some_var;              // Error: there is no type named"foo"
struct foo some_other_var; // Ok
typedef struct foo myfoo;
myfoo something_else;      // Ok, typedef'd name
// Or...
typedef struct foo foo;
foo now_this_is_ok_but_confusing;


这里的重点是静态局部变量。静态局部变量将只初始化一次,该值将保存并在孔程序上下文中共享。这意味着startw和endw将在下次调用计时时使用。

在程序中,您可以多次调用计时:

1
2
3
4
5
timing(true);
//startw will be initialzed
timing(false);
//endw is initialized, and the startw has been saved on the prevous invoking.
......

我希望我的描述清楚。您可以看到静态局部变量是静态变量,它将保存在全局上下文中。