《c primer plus》

2849 ワード

Page 342
一.static変数
C言語ではstaticキーワードには2つの意味があります.
1.関数の外側に配置すると、ファイルの内部に表示されるグローバル変数が表示されます.
2.関数内に配置して、コードブロックの役割ドメインを持つ静的変数を表す.
#include <stdio.h>

void static_test()
{
    /*             ,  testVar            ,      ,        ,        testVar           */
    static int testVar = 1;
    testVar++;
    printf("%d
", testVar); } int main() { static_test(); static_test(); return 1; }

プログラム実行結果は2,3である.
 
二.extern
P350
 
一緒にコンパイルされたプロジェクトでは、
もう1つのファイル定義の関数は、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
", 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
", 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;
}

 
出力:message 1: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