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的静态结构变量。
我试着读懂这是怎么回事,但还没有找到一个足够好的解释。有什么帮助吗?
您可能更习惯使用具有
1 | struct foo { int bar; }; |
然后您声明(并在这里定义)一个名为
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. ...... |
我希望我的描述清楚。您可以看到静态局部变量是静态变量,它将保存在全局上下文中。