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