C语言#error预处理

#error 预处理指令的作用是,编译程序时,只要遇到#error 就会生成一个编译错误提示消息,并停止编译。其语法格式为:

#error error-message

注意,宏串error-message 不用双引号包围。遇到#error 指令时,错误信息被显示,可能同时还显示编译程序作者预先定义的其他内容。

该预处理将产生一条编译时错误信息,信息中包含#error后指定的内容。

C语言标准中,要求对于#error后面的指定的内容也进行宏展开,但在我测试后发现Visual Studio 2008并没有对这一特性提供支持。所以,在我们的程序中,应尽量避免出现不同编译器实现可能各不相同的标准特性。

该预处理器指令看似无用,因为一旦遇到它,程序的编译过程就会出错,无法完成编译。那么它应该用在什么场合呢?

大家想必对”断言“早有耳闻。在程序运行时,一旦遇到断言不成立,程序即会报错终止,以方便程序调试。#error与#if搭配使用可以认为是一个用于调试宏的编译期断言。

下面看一个例子说明#error的典型应用实例:

[html]  view plain  copy
  1. #include "stdio.h"  
  2. int main(int argc, char* argv[])   
  3. {  
  4. #define CONST_NAME1 "CONST_NAME1"  
  5.     printf("%s\n",CONST_NAME1);  
  6. #undef CONST_NAME1  
  7.   
  8. #ifndef CONST_NAME1  
  9.     #error No defined Constant Symbol CONST_NAME1  
  10. #endif  
  11.   
  12. #define CONST_NAME2 "CONST_NAME2"  
  13.     printf("%s\n",CONST_NAME2);    
  14.     printf("%s\n",CONST_NAME2);      
  15.     return 0;   
  16. }   
在编译的时候输出如编译信息 :

 fatal error C1189: #error : No defined Constant Symbol CONST_NAME1

上面的代码会引发一个#error错误。综上,对含有复杂逻辑的宏代码使用#error是一个很好用的技巧。它确保了程序在关键点上确实按照程序员的想法被预处理,否则便无法编译通过。而且,重要的是:编译期行为不会引起任何运行期的资源开销。



编译程序时,只要遇到 #error 就会跳出一个编译错误,既然是编译错误,要它干嘛呢?其目的就是保证程序是按照你所设想的那样进行编译的。

下面举个例子:
程序中往往有很多的预处理指令
#ifdef XXX
...
#else

#endif

当程序比较大时,往往有些宏定义是在外部指定的(如makefile),或是在系统头文件中指定的,当你不太确定当前是否定义了 XXX 时,就可以改成如下这样进行编译:

#ifdef XXX
...
#error "XXX has been defined"

#else

#endif

这样,如果编译时出现错误,输出了XXX has been defined,表明宏XXX已经被定义了。


用处就是这样,是不是感觉很没有用处?

你可能感兴趣的:(#error)