C语言#error预处理 |
您所在的位置:网站首页 › 荣誉室在哪 › C语言#error预处理 |
#error 预处理指令的作用是,编译程序时,只要遇到#error 就会生成一个编译错误提示消息,并停止编译。其语法格式为: #error error-message注意,宏串error-message 不用双引号包围。遇到#error 指令时,错误信息被显示,可能同时还显示编译程序作者预先定义的其他内容。 该预处理将产生一条编译时错误信息,信息中包含#error后指定的内容。 C语言标准中,要求对于#error后面的指定的内容也进行宏展开,但在我测试后发现Visual Studio 2008并没有对这一特性提供支持。所以,在我们的程序中,应尽量避免出现不同编译器实现可能各不相同的标准特性。 该预处理器指令看似无用,因为一旦遇到它,程序的编译过程就会出错,无法完成编译。那么它应该用在什么场合呢? 大家想必对”断言“早有耳闻。在程序运行时,一旦遇到断言不成立,程序即会报错终止,以方便程序调试。#error与#if搭配使用可以认为是一个用于调试宏的编译期断言。 下面看一个例子说明#error的典型应用实例: [html] view plain copy #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已经被定义了。用处就是这样,是不是感觉很没有用处? |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |