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已经被定义了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值