1.#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__);
2.#error
当预处理器预处理到#error命令时将停止编译并输出用户自定义的错误消息。
注:上述语法成份中的方括号“[]”代表用户自定义的错误消息可以省略不写。