debug 输出 以及宏定义

本文介绍了一种改进的NSLog使用方法,通过自定义宏DLog来提高日志记录效率。该方法可根据编译类型(debug或release)选择性地记录详细信息,包括文件名、函数名和行号等,有助于更高效地进行调试。
使用NSLog的一个风险是:它的运行会占用时间和设备资源。

所以在编译版本前一定不要有nslog。 同时当你的工程中有很多log 输出的时候 查找起来很不方便 ,下面介绍一种方法 可以使我们事半功倍。

解决步骤:

  1. 修改<AppName>-Prefix.pch ,增加以下的宏代码
    [cpp]  view plain copy
    1. #ifdef DEBUG  
    2. # define DLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);  
    3. #else  
    4. # define DLog(...);  
    5. #endif  
  2. 在程序中使用DLog来替换原来的NSLog
    [cpp]  view plain copy
    1. DLog(@"当前程序目录是:%@", [self applicationDocumentsDirectory ]);  

  3. 修改项目的配置,使得在debug编译的时候,编译DLog的宏,产生详细的日志信息,而release的时候,不产生任何控制台输出
    在Other Linker Flags 中,在debug的时候,加入编译属性 -DEBUG
  4. 这样控制台会显示这样的日志信息
    [cpp]  view plain copy
    1. 2011-12-27 22:23:53.303 IManager[5449:b603] [文件名:/Users/roamer/Project/hufeng/IManager/IManager/AppDelegate.m]  
    2. [函数名:-[AppDelegate application:didFinishLaunchingWithOptions:]]  
    3. [行号:37]   
    4. 当前程序目录是:/Users/roamer/Library/Application Support/iPhone Simulator/4.3.2/Applications/6B0E7B08-5528-468A-B728-0C4580805368/Documents  

    补充:

      1) __VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错, 你可以试试。
      2) __FILE__ 宏在预编译时会替换成当前的源文件名
      3) __LINE__宏在预编译时会替换成当前的行号
      4) __FUNCTION__宏在预编译时会替换成当前的函数名称
### C/C++ 中 Debug 宏定义的使用方法 在开发过程中,`DEBUG`是一种常用的调试工具。通常情况下,在生产环境中不希望保留过多的日志打印或者额外的功能验证逻辑,因此可以利用条件编译来控制这些代码的存在与否。 当启用 `DEBUG`模式时,可以通过特定的操作(比如设置编译选项 `-DDEBUG=1`),使得某些仅用于调试目的语句生效;而在发布版本中,则不会包含这部分可能影响性能的内容[^1]。 #### 基本形式 最简单的做法就是直接判断是否定义了某个标识符: ```c++ #ifdef DEBUG printf("Debug information\n"); #endif ``` 这段代码表示如果当前编译环境中有定义名为`DEBUG`的,则执行其中间的部分,即输出一条消息到标准错误流上。如果没有定义该,则跳过此段落而不生成任何目标机器指令。 #### 高级应用实例 对于更复杂的需求来说,还可以创建自定义的来进行更加灵活多样的操作。例如下面的例子展示了如何构建一个带有参数传递能力的日志记录函数: ```cpp #define LOG(msg) \ do { \ if (DEBUG)\ std::cerr << msg << "\n";\ } while(0) // 使用方式如下所示: LOG("Variable value is " << variable); ``` 这里引入了一个新的关键字`do...while()`结构体是为了防止可能出现的一元运算符优先级问题所引起的语法解析错误。同时注意到了字符串连接的方式采用了C++风格的标准库对象`std::cerr`以及位移操作符重载实现自动拼接功能[^2]。 另外一种常见的场景是在头文件里声明一些辅助性的全局变量或者是静态局部变量作为开关标志位,以便于在整个项目范围内统一管理不同模块之间的交互行为。这有助于减少重复劳动并提高维护效率。 #### 实际案例分析 考虑到实际应用场景中的需求多样性,有时还需要考虑跨平台兼容性和第三方依赖项等因素的影响。以Visual Studio Code为例,其提供了强大的插件生态系统支持多种编程语言及其框架特性集成化解决方案。针对Python和C++混合工程而言,VSCode能够很好地满足开发者们日常工作中涉及到的各种任务流程自动化处理工作,包括但不限于断点跟踪、单步执行等功能[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值