Page 342
一. static 变量
在C语言中static关键字有两种含义。
1. 放在函数外表示文件内部可见的全局变量。
2. 放在函数内表示具有代码块作用域的静态变量。
#include <stdio.h> void static_test() { /*这条语句并不是一条执行语句,其实testVar只在程序编译时初始化一次,在函数执行时,这条语句是没有的,放在这里只是表示testVar变量只有在函数内部可用*/ static int testVar = 1; testVar++; printf("%d\n", testVar); } int main() { static_test(); static_test(); return 1; }
程序执行结果为 2, 3。
二. extern
P350
在一起编译的工程里,
另一个文件定义的函数,在没有include该函数文件头的情况下,可以通过extern声明,在本文件中调用它。
例如:
rand0.c文件内容如下
static unsigned long int next = 1; int rand0() { next = next * 1103515245 + 12345; return (unsigned int)(next/65536)%32768; }
r_drive1.c文件内容如下
/*和rand0.c函数一同编译*/ #include <stdio.h> extern int rand0(void); int main() { int count; for(count = 0; count < 5; count++) { printf("%hd\n", rand0()); } return 0; }
这样是可以运行的。
三. union
union的定义可以像下面这样使用
#include <stdio.h>
typedef struct {
int name_id;
int course_id;
union {
int student_id;
int class_id;
}u;
} dhct_attri_profile_t;
int main(int argc, char **argv)
{
dhct_attri_profile_t tmp = {1, 2, .u.student_id = 3};
printf("%d\n", tmp.u.student_id);
return 0;
}
四. __VA_ARGS__ 和 va_list
#include <stdio.h> #define PR(x, ...) printf("message"#x ":" __VA_ARGS__) int main(int argc, char **argv) { PR(1, "%s", "today is a good day."); return 0; }
输出:
message1:today is a good day.
#include <stdarg.h> void vaTest(int byPort, ...) { va_list pvaArgList; va_start(pvaArgList, byPort); int iConfigEnum = 0; int iConfigPara = 0; for(; ;) { if((iConfigEnum = va_arg(pvaArgList, int)) == 0) { break; } if((iConfigPara = va_arg(pvaArgList, int)) == 0) { break; } printf("%d %d", iConfigEnum, iConfigPara); } va_end(pvaArgList); } int main(int argc, char **argv) { vaTest(1,2,3,5,6,0); return 0; }
输出 2 3 5 6