做过产品定制开发和维护的小伙伴应该有过这样的经历,一个程序往往因客户的定制使用了很多条件编译(#if/#ifdef/#ifndef/#if defined等),如果定制内容不是很多,维护还好,只要跳转到对应的#define宏定义去查看其设置值;但如果定制内容较多,并且比较分散在多个文件中,或者虽然在同一个文件,但分散在文件不同位置,(当然,这种情况建议使用单独一个头文件mycustom.h来存放所有的定制,便于维护),定制完成之后,为了保证不出错,自己还得一个个对着头文件宏定义再核查一遍,如果条件编译或宏定义嵌套较多,这样核对不仅效率较低,而且可能看花眼而弄错。
那有没有方便一点的方法来检查定制呢?

答案是肯定的!C/C++预处理指令#pragma message和#error可以帮到你:
我们在Keil C51环境下来看个例子,先在一个头文件中(比如mycustomopt.h)作宏定义如下:
- #pragma message “message_str”:当预处理器预处理到该指令时输出将字符串发送到标准输出窗口(如Keil的Build Output窗口、WINDOWS控制台等);
- #error “error_message_str”:当预处理器预处理到该指令时将停止编译并输出用户自定义的错误消息。

然后在mycustom.h中编写程序,设置定制选项,编译,如下图:

更改CUSTOM宏定义,然后编译:

屏蔽CUSTOM宏定义,编译如下:

小伙伴们,这样来核对定制是不是轻松许多呢?
值得注意的是,Keil ARM(MDK)似乎不支持这两个预编译指令(有点搞不懂~),编译后会发出警告:

支持原创,转载时请注明出处,疯狂码者愿与你一起努力,共同成长,谢谢!
来源 ,疯狂码者