开发者社区> 问答> 正文

最近重新组织书了。。:报错

最近整理开发用的基础库和工具链,正好把快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;
}
有什么用,运行一下就知道了。算我工具链里面最看不上眼的一个。

展开
收起
kun坤 2020-06-14 09:10:57 377 0
0 条回答
写回答
取消 提交回答
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
组织互联网和敏捷组织 立即下载
面向关键信息基础设施的等级保护 立即下载
打造面向未来商业的无边界组织 立即下载