首页 > 代码库 > C语言随笔记(二)厉害的宏
C语言随笔记(二)厉害的宏
比最牛逼的FOPEN宏更牛逼的USING_FILE宏
#define USING_FILE(file,path,type,code) \
{\
FILE *##file;\
if (NULL == (##file = fopen(path, type)))\
{\
fputs("内存不足程序退出中", stderr);\
exit(EXIT_FAILURE);\
}\
##code;\
fclose(##file);\
}
举例
仍然处理”将worker_one.rec文件内容复制到worker_two.rec文件中”,
这个问题,代码如下
USING_FILE(wo_file,”worker_one.rec”,”rb”,
{
USING_FILE(wt_file,”worker_two.rec”,”wb”,
{
for(int c;(c=fgetc(wo_file))!=EOF;fputc(c,wt_file))
;
});
});
推荐加上括号美观(也推荐括号另起一行),是不是有一种函数式编程的感觉呢.
哈哈,也许你也被我坑了,其实上面的代码只是一厢情愿.对于第二个参数,宏只当
字符串处理.不会再替换了,把它当成宏.正确的做法还需要求助FOPEN这个宏.混搭.
#define FOPEN(file,path,type) \
FILE *##file;\
if (NULL == (##file = fopen(path, type)))\
{\
fputs("内存不足程序退出中", stderr);\
exit(EXIT_SUCCESS);\
}
正确的代码为:
USING_FILE(wo_file,”worker_one.rec”,”rb”,
{
FOPEN(wt_file,”worker_two.rec”,”wb”);
for(int c;(c=fgetc(wo_file))!=EOF;fputc(c,wt_file))
;
fclose(wt_file);
});
这里也看的出来USING_FILE这个宏使用时不能嵌套,一个优美的鸡肋.表达了某个C程序
员的美好想法吧.(宏还存在一个问题,宏参不能太长,否则有的编译器会出现警告.后导致错误,再扯一下,解决这个错误的方法就是将代码块封装为函数.)
13 比牛逼的MALLOC宏更彻底的TYPE_MALLOC宏
#define TYPE_MALLOC(type,var) ;\
##type *##var;\
if(NULL==(##var=malloc(sizeof(##type))))\
{\
fputs("内存申请失败,程序退出中...",stderr);\
exit(EXIT_FAILURE);\
}
举例
如果你想声明一个int *hoge;
那么可以写成 TYPE_MALLOC(int,hoge);
同样如果你有一个这样一个结构体
typedef
struct node
{
int num;
char *name;
}
NODE;
如果你想声明一个结点结构体指针变量,可以写成
TYPE_MALLOC(NODE,pnode);
对于这个宏适用于第一次声明指针变量并想分配空间的情况.上面的宏不知道有没有人好奇,为什么开始有个;.其实这个;是一个空语句.主要是为了解决,这样的错误情况”宏定义不能以##开头”.当然也可以用其它方式解决这个错误,例如添加”{}”,等等.宏很吊,有点像C中的第二种语法,生成代码的代码.上面的宏推荐写成这样:
#define POINTER_MALLOC(type,var) type *var;\
if(NULL==(var=malloc(sizeof(type)))){\
fputs("内存申请失败,程序退出中...",stderr);\
exit(EXIT_FAILURE);\
}
再次扩展一下,其实下面的宏用法最多:
#define POINTER_MALLOC(type,var,num) type *var;\
if(NULL==(var=malloc(sizeof(type)*num))){\
fputs("内存申请失败,程序退出中...",stderr);\
exit(EXIT_FAILURE);\
}
上面那个宏现在也不是很标准,采用下面这个宏,但是这个宏目前依赖stdio.h和stdlib.h文件.代码如下:
#define POINTER_MALLOC(type,var,num) type *var;\
if(!(var=malloc(sizeof(type)*(num)))){\
fputs("内存申请失败,程序退出中...\n",stderr);\
exit(EXIT_FAILURE);\
}
外加一个宏吧:
#define TYPE_MALLOC(type,var) type *var;\
if(!(var=malloc(sizeof(type)))){\
fputs("内存申请失败,程序退出中...\n",stderr);\
exit(EXIT_FAILURE);\
}