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