C语言#error预处理

#error 预处理指令的作用是,编译程序时,只要遇到#error 就会生成一个编译错误提示消息,并停止编译。其语法格式为:
#error error-message
  • 注意,宏串error-message 不用双引号包围。遇到#error 指令时,错误信息被显示,可能同时还显示编译程序作者预先定义的其他内容。

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

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

该预处理器指令看似无用,因为一旦遇到它,程序的编译过程就会出错,无法完成编译。那么它应该用在什么场合呢?
  • 大家想必对”断言“早有耳闻。在程序运行时,一旦遇到断言不成立,程序即会报错终止,以方便程序调试。#error与#if搭配使用可以认为是一个用于调试宏的编译期断言。

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

#include "stdio.h"  
int main(int argc, char* argv[])   
{  
#define CONST_NAME1 "CONST_NAME1"  
    printf("%s\n",CONST_NAME1);  
#undef CONST_NAME1  
  
#ifndef CONST_NAME1  
    #error No defined Constant Symbol CONST_NAME1  
#endif  
  
#define CONST_NAME2 "CONST_NAME2"  
    printf("%s\n",CONST_NAME2);    
    printf("%s\n",CONST_NAME2);      
    return 0;   
}   
  • 在编译的时候输出如编译信息 :
 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已经被定义了。

转自

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值