Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3759426
  • 博文数量: 880
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 6155
  • 用 户 组: 普通用户
  • 注册时间: 2016-11-11 09:12
个人简介

To be a better coder

文章分类

全部博文(880)

文章存档

2022年(5)

2021年(60)

2020年(175)

2019年(207)

2018年(210)

2017年(142)

2016年(81)

分类: LINUX

2016-11-12 16:16:08

#define语句

我们经常会这样定义一些宏:

#define BLOCK 8192

但这样的宏却不能在字符串中展开,如:

printf("The BLOCK number./n");

输出:

The BLOCK number.

 

想要把宏处理成字符串,可以使用#号,如:

#define MONCK(ARGTERM) /
    printf("The term " #ARGTERM " is a string/n")
MONCK(A to B);
输出:
The term A to B is a string

可变参数的宏:

可变参数可以用三个点(...)来表示,可以用__VA_ARGS__来展开,如:

#define err(...) fprintf(stderr,__VA_ARGS__)
err("%s %d/n","The error code: ",48);
一般,我们可以这样打印错误信息:

fprintf(stderr,"%s %d/n","The error code ",48);

但想要另外输出其它信息,我们可以这样定义一个可变参数的宏,例如:

#define errout(a,b,...) /
    fprintf(stderr,"File %s     Line %d/n",a,b); /
    fprintf(stderr,__VA_ARGS__)
那么我们就可以这样使用这个宏:

errout(__FILE__,__LINE__,"Unexpected termination/n");

因为__VA_ARGS__在fprintf中的内部实现使用了逗号来作分割符,所以必须要求至少有一个参数,如果想使__VA_ARGS__为空,可以这样使用:

fprintf(stderr, ##__VA_ARGS__);

 

#error语句将会使编译器报告一个严重的错误并挂起,可以用它产生一些条件陷阱,例如:

#ifndef __unix__
#error "This section will only work on UNIX systems"
#endif
只有__unix__被定义的情况下,上面的代码才会编译成功。

 

#warning和#error语句相似,但它报告的错误类型只是警告信息,没有#error那么报告的那么严重,所以会产生一个警告信息,并继续编译。

阅读(1394) | 评论(0) | 转发(0) |
0

上一篇:Linux之netlink学习

下一篇:c函数指针详解

给主人留下些什么吧!~~