【问题标题】:How do I declare a debug only statement如何声明仅调试语句
【发布时间】:2010-10-03 12:46:56
【问题描述】:

在 C# 中,我可以使用以下代码来生成仅在调试构建期间执行的代码,如何在 Xcode 中执行相同的操作?

#if DEBUG
{
    // etc etc
}
#endif

【问题讨论】:

    标签: objective-c xcode


    【解决方案1】:

    你可以使用

    #ifdef DEBUG
        ....
    #endif
    

    您需要在调试配置的设置中将DEBUG=1 添加到项目的预处理器符号定义中,因为 Xcode 不会自动为您完成。

    我个人更喜欢使用DEBUG=1 而不是检查NDEBUG=0,因为后者意味着默认构建配置包含调试信息,然后您必须显式关闭这些信息,而“DEBUG=1”意味着转向on 仅调试代码。

    【讨论】:

    • 是的,现在看起来这是默认定义的——我刚刚在 Xcode 中创建了一个标准的 iOS 项目,并在项目构建设置的 Preprocessor Macros/Debug 部分预设了 DEBUG=1。
    【解决方案2】:

    在发布模式构建中应该已经为您定义了 NDEBUG 符号

    #ifndef NDEBUG
    /* Debug only code */    
    #endif 
    

    通过使用 NDEBUG,您不必为调试构建自己指定 -D DEBUG 参数给编译器

    【讨论】:

    • 但您仍然必须在编译器设置中添加 NDEBUG 才能使用发布模式。许多程序员更喜欢#ifdef DEBUG 而不是#ifndef NDEBUG 中的双重否定
    • 我知道很多人喜欢它,但用于发布的 NDEBUG 是 C 标准。坚持下去,你就会省去麻烦。 NEDBUG 也应该在 Xcode 发布版本中为您定义
    • 我很抱歉 XCode 似乎没有默认定义它。这里是你应该去添加它的地方:developer.apple.com/tools/xcode/xcodebuildsettings.html
    • 附注如果他想将 assert() 的行为与他自己的调试代码分离怎么办?
    • 绝对如果他想控制自己,他需要做出有意识的决定并做出相应的定义。这似乎是 XCode 实现者不以 VS 和其他方式提供一些默认定义的基本原理。我只是认为他应该从标准开始。
    【解决方案3】:

    DEBUG 现在在项目/预处理器宏下默认定义为“调试模式”。所以测试它总是有效的,除非你有一个非常古老的项目。

    但是我讨厌它弄乱了代码缩进并且不是特别紧凑的事实。这就是为什么我使用另一个让生活更轻松的宏。

    #ifdef DEBUG
    #define DEBUGMODE YES
    #else
    #define DEBUGMODE NO
    #endif
    

    所以测试 DEBUGMODE 值要紧凑得多:

    if (DEBUGMODE) {
    //do this
    } else {
    //do that
    }
    

    我最喜欢的:

    NSTimeInterval updateInterval = DEBUGMODE?60:3600; 
    

    【讨论】:

      【解决方案4】:

      有一个非常有用的调试技术说明:Technical Note TN2124 Mac OS X Debugging Magic http://developer.apple.com/technotes/tn2004/tn2124.html#SECENV 包含许多有用的东西,可用于调试您的应用程序。

      托尼

      【讨论】:

        猜你喜欢
        • 2021-01-17
        • 1970-01-01
        • 1970-01-01
        • 2019-02-23
        • 2023-03-20
        • 2014-10-26
        • 2014-04-12
        • 2017-09-06
        • 2020-04-20
        相关资源
        最近更新 更多