独闷闷网

标题: 如何巧妙的使用条件编译,避免到处加 #ifdef这种语句的麻烦?已解答。 [打印本页]

作者: jianhong_wu    时间: 2018-3-11 14:18
标题: 如何巧妙的使用条件编译,避免到处加 #ifdef这种语句的麻烦?已解答。
李猛-珠海:
问大家个问题,单片机在编程初期的时候为了调试观察数据会在程序中写很多串口打印的语句,即Printf 。当程序写好了(此时程序可以稳定的运行了)以后需要把这些串口打印的语句再一个一个删除的话非常麻烦,因为程序红很多地方都谢了串口打印的语句,请问有什么好的办法解决这个问题吗?

肖亚平-成都:
条件编译可以解决你的问题.
比如  :

  1. #define  _DEBUG //调试模式。当换回产品模式的时候,把这行代码注释掉就可以。

  2. #ifdef _DEBUG
  3.   // ... do some operations,串口打印
  4.   #endif
复制代码



李猛-珠海:
  1. #ifdef _DEBUG
  2.   printf("");   
  3.   #endif              在程序中每处需要打印的地方都这么写吗?
复制代码


hippo-深圳:
  1. #define DEBUG_LOG
  2. #ifdef DEBUG_LOG
  3. #define log_msg(s)    printf(s)
  4. #else
  5. #define log_msg(s)  
  6. #endif
复制代码

这样好一些,不用到处加 #ifdef xxxx

李猛-珠海:
这里我有个疑问   当没有#define DEBUG_LOG 这条语句的时候
  1. #ifdef DEBUG_LOG  
  2. #define log_msg(s)    printf(s)
  3. #else
  4. #define log_msg(s)  
  5. #endif
复制代码

会编译#else后的 #define log_msg(s) 这条语句   这条语句有舍作用呢
为啥就能够不打印呢?



hippo-深圳:
DEBUG_LOG没有定义时, log_msg()就是一个空语句,不会生产代码。STM32库里面的 assert_param() 也是这样搞的。搜索一下 USE_FULL_ASSERT,很普通的做法。






欢迎光临 独闷闷网 (http://www.dumenmen.com/) Powered by Discuz! X3.2