首页 > 代码库 > 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.hstdlib.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);\

}