gcc:预处理语句--#define、#error和#warning
2010-01-18 16:19
363 查看
#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那么报告的那么严重,所以会产生一个警告信息,并继续编译。
我们经常会这样定义一些宏:
#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那么报告的那么严重,所以会产生一个警告信息,并继续编译。
相关文章推荐
- gcc:预处理语句
- gcc:#error和#warning
- 预处理程序--#define 语句
- gcc:预处理语句--#if, #elif, #else, #endif和#ifdef,#ifndef
- gcc:预处理语句--#include和#include_next
- gcc:预处理语句#if、#elif、#else、#endif等
- gcc:预处理语句--#include和#include_next
- gcc:预处理语句--#include和#include_next
- gcc:预处理语句--#include和#include_next
- 预处理语句和存储过程
- 预处理语句的使用-代码典型缺陷分析(一)
- gcc 从语言编译全过程 预处理---->编译---->汇编----->链接
- gcc对C语言的扩展:语句内嵌表达式(statement-embedded expression) 推荐
- #error、#warning和#line
- 关于#define语句后面加括号与不加括号的区别
- 预处理语句占位符的使用
- #define预处理的弊端
- MySQL 的 C API预处理语句
- 【mysql】-内置函数和预处理语句
- Verilog HDL的编译预处理语句