便于移植,最好在代码编写的时候 采用格式定义
格式定义
注意无符号跟有符号的转换,溢出导致出现的死循环等
//重新定义一些类型
//防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。
typedef unsigned char boolean; /* Boolean value type. */
typedef unsigned long uint32; /* Unsigned 32 bit value */
typedef unsigned short uint16; /* Unsigned 16 bit value */
typedef unsigned char uint8; /* Unsigned 8 bit value */
typedef signed long int32; /* Signed 32 bit value */
typedef signed short int16; /* Signed 16 bit value */
typedef signed char int8; /* Signed 8 bit value */
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef NULL
#define NULL 0
#endif
一些常用宏定义
想了解更多,这里是原出处,这里记录下自己遇到过的.
得到一个field在结构体(struct)中的偏移量
#define FPOS(type,field) ((uint32)&((type *)0)->field)
代码的注释 宏打开与关闭 #define DEVELOP_TEST_ENV 1 #if DEVELOP_TEST_ENV #define LogMsg(…)\ {API_Trace(DBG_APP_MASK,##VA_ARGS);}
#define LogMem(pMsg,pData,iDatalen) \ {API_TraceHex(DBG_APP_MASK,pMsg,pData,iDatalen);}
#else #define LogMsg(…) #define LogMem(pMsg,pData,iDatalen) #endif
得到一个结构体中field所占用的字节数
#define FSIZ(type,field) sizeof(((type *)0)->field)
宏定义要注意-定义的是函数
有问题的定义:#define DUMP_WRITE(addr,nr) {memcpy(bufp,addr,nr); bufp += nr;}
应该使用的定义: #define DO(a,b) do{a+b;a++;}while(0)
下面是一个例子
if(addr) DUMP_WRITE(addr,nr); else do_somethong_else(); 宏展开以后变成这样: if(addr) {memcpy(bufp,addr,nr); bufp += nr;}; else do_something_else();
可变参数
如下利用
可变参数来记录日志内容
int ZTlog_tofile(char filename,char * format,…)
{
int n;
FILE * logfile;
char tempbuf[64];
int filesize=0;
va_list arg_ptr; //变体参数变
//取得变体参数,开始变体参数处理
va_start(arg_ptr, format);
struct tm *timestrp;
time_t timep=time(NULL);
timestrp=localtime(&timep);
filesize = get_file_size(filename);
if(filesize>=41024*1024)
{
remove(filename);
}
logfile = fopen(filename, “a+”);
if(logfile<0)
return 0;
//写日期时间
memset(tempbuf,0x0,sizeof(tempbuf));
sprintf(tempbuf,”%04d/%02d/%02d %02d:%02d:%02d “,timestrp->tm_year+1900,
timestrp->tm_mon+1,timestrp->tm_mday,timestrp->tm_hour,
timestrp->tm_min,timestrp->tm_sec);
fwrite(tempbuf, 1, strlen(tempbuf), logfile);
n = vfprintf(logfile, format, arg_ptr); //返回值为写入的字节数
va_end(arg_ptr); //结束变体参数处理
fclose(logfile); //刷新文件
return 0;
}
扫描关注我
(转载本站文章请注明作者和出处 Undefined)