最近重新组织书了。。

中山野鬼 发布于 2013/07/12 23:41
阅读 445
收藏 3

最近整理开发用的基础库和工具链,正好把快2年前答应编辑朋友的事情重新提起来,就是写书。不过这次基本是写如何在linux下做开发。下面的例子,是用于检测生成types.h的。看看是否初学的有多少问题。我好有针对性的把解释,放内容里。

三个文件

/*
 * File: test_create_type_main.c
 * Author: luckystar
 * 
 * Created on 2013-07-12 15:15
*/


#include "create_type.h"

int main(int argc ,char *argv[]){
	print_type("l","#ifndef _TYPES_H_");
	
	print_type("l","#define _TYPES_H_");
	print_type("k","//the integer type def");
	print_type("i",8);
	print_type("i",16);
	print_type("i",32);
	print_type("i",64);
	print_type("i",128);
	print_type("k","//the point type def");
	print_type("p");
	print_type("k","//the string type def");
	print_type("s");
	print_type("k","//the index type def");
	print_type("I");
	print_type("k","");
	print_type("l","#endif // _TYPES_H_");
	return 0;
}
/*
 * File: create_type.h
 * Author: luckystar
 * 
 * Created on 2013-07-12 15:15
 */
#ifndef _CREATE_TYPE_H
#define _CREATE_TYPE_H


void print_type(char *fmt,...);

#endif /* _CREATE_TYPE_H */
/*
 * File: create_type.c
 * Author: luckystar
 * 
 * Created on 2013-07-12 15:15
 */

#include <stdio.h>
#include <stdarg.h>
static unsigned char tab_i = 0;

#define mkstr(s) # s

#define _print_type(_T_,w) if ((sizeof(_T_) << 3) == w){\
	if (tab_i & (w >> 3)){ return ;}\
	tab_i |= (w >> 3);\
 printf("typedef signed %s _i%d;\n",mkstr(_T_),w);\
 printf("typedef unsigned %s _u%d;\n",mkstr(_T_),w);\
}
static void print_typedef(char *src,char *dst){
	printf("typedef %s %s;\n",src,dst);
}
static void print_i_type(char w){

	_print_type(char,w);
	_print_type(short,w);
	_print_type(int,w);
	_print_type(long,w);
	_print_type(long long,w);
	_print_type(long long int,w);
	return ;
}

static  void print_p_type(void){
	print_typedef("void","BYTE");
	print_typedef("BYTE *","_p");
}
static void print_s_type(void){
	print_typedef("char *","_s");
	print_typedef("const char *","_const_s");
}
static void print_I_type(void){
	print_typedef("_u32","_I");
	print_typedef("_u64","_I64");
}
static void print_line(char *s){
	printf("%s\n",s);
}
static void print_skip_line(char *s){
	printf("\n%s\n",s);
}

void print_type(char *fmt,...){
	va_list params;

	va_start(params,fmt);
	if (fmt ==0){
		printf("fmt is error!\n");
		return ;
	}
	if (fmt[0] == 'i'){
		char w = (char)va_arg(params,int);
		print_i_type(w);return;
	}
	if (fmt[0] == 'p'){
		print_p_type();	return;
	}
	if (fmt[0] == 's'){
		print_s_type();	return;
	}	
	if (fmt[0] == 'I'){
		print_I_type(); return;
	}
	if (fmt[0] == 'l'){
		char *s = va_arg(params,char*);
		if (s == 0) return;
		print_line(s); return;
	}
	if (fmt[0] == 'k'){
		char *s = va_arg(params,char*);
		if (s == 0) return;
		print_skip_line(s); return;
	}
	//error fmt
	return;
}
有什么用,运行一下就知道了。算我工具链里面最看不上眼的一个。
加载中
0
nightlyaxe
nightlyaxe


#ifndef _TYPES_H_
#define _TYPES_H_

//the integer type def
typedef signed char _i8;
typedef unsigned char _u8;
typedef signed short _i16;
typedef unsigned short _u16;
typedef signed int _i32;
typedef unsigned int _u32;
typedef signed long long _i64;
typedef unsigned long long _u64;

//the point type def
typedef void BYTE;
typedef BYTE * _p;

//the string type def
typedef char * _s;
typedef const char * _const_s;

//the index type def
typedef _u32 _I;
typedef _u64 _I64;


#endif // _TYPES_H_


野鬼出书,必属精品!,赶紧出书,出了一定买!

2个小疑惑,65到73行,像这样子的是不是有种类似查表的写法啊?不用switch?


nightlyaxe
nightlyaxe
书的内容包括之前的讲座和博客吧?期待。
中山野鬼
中山野鬼
这个算我书的第二章节的内容,连if还没说呢。别提switch了,所以只引用了if ,随后再解释if。
0
OscerSong
OscerSong
大圣啊,别太难了 要面向大众
中山野鬼
中山野鬼
就是想面向大众说点能懂的。。。
返回顶部
顶部