#error预处理器指令
格式:
#error any message
该预处理将产生一条编译时错误信息,信息中包含#error后指定的内容。
C语言标准中,要求对于#error后面的指定的内容也进行宏展开,但在我测试后发现Visual Studio 2008并没有对这一特性提供支持。所以,在我们的程序中,应尽量避免出现不同编译器实现可能各不相同的标准特性。
该预处理器指令看似无用,因为一旦遇到它,程序的编译过程就会出错,无法完成编译。那么它应该用在什么场合呢?
大家想必对”断言“早有耳闻。在程序运行时,一旦遇到断言不成立,程序即会报错终止,以方便程序调试。#error与#if搭配使用可以认为是一个用于调试宏的编译期断言。一个典型的用途如下代码所示:
#include <stdio.h>
// CONDITION_A与CONDITION_B不能同时定义,否则会造成错误
#define CONDITION_A
#define CONDITION_B
int main(int argc, char** argv)
{
// 使用CONDITION_A和CONDITION_B前再次判断一下,确保它们不会被同时定义
#if defined(CONDITION_A) && defined(CONDITION_B)
#error Define CONDITION_A and CONDITION_B at the same time.
#endif
#ifdef CONDITION_A
printf("CONDITION_A\n"); // 定义了CONDITION_A
#endif // CONDITION_A
#ifdef CONDITION_B
printf("CONDITION_B\n"); // 定义了CONDITION_B
#endif // CONDITION_B
return 0;
}
上面的代码会引发一个#error错误。
综上,对含有复杂逻辑的宏代码使用#error是一个很好用的技巧。它确保了程序在关键点上确实按照程序员的想法被预处理,否则便无法编译通过。而且,重要的是:编译期行为不会引起任何运行期的资源开销。
(■版权声明: 原创内容,转载仅限非商业用途,并需注明出处: http://blog.csdn.net/LoveASPDotNet)