最近整理开发用的基础库和工具链,正好把快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; }有什么用,运行一下就知道了。算我工具链里面最看不上眼的一个。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。