《c primer plus》


 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

 


 

 

你可能感兴趣的:(《c primer plus》)