代码块的调试宏

Debug Macro for code block

本文关键字:调试 代码      更新时间:2023-10-16

我试图创建一个宏,执行代码块只有当它是一个调试构建。我已经设法使一个执行一行只有在调试启用,但我不知道如何做一个完整的代码块。

下面是一行宏:

#include <iostream>
//error checking
#if defined(DEBUG) | defined(_DEBUG)
    #ifndef DBG_ONLY
         #define DBG_ONLY(x) (x)            
    #endif
#else
    #ifndef DBG_ONLY
        #define DBG_ONLY(x) 
    #endif
#endif 

int main () {
    DBG_ONLY(std::cout << "yar" << std::endl);
    return 0;

}

将宏包装在do-while循环中,这样可以避免在if (cond) DBG_ONLY(i++; j--;)等条件语句中使用宏时出现问题。它还为仅用于调试的声明创建了一个新的作用域:

#if defined(DEBUG) | defined(_DEBUG)
    #ifndef DBG_ONLY
      #define DBG_ONLY(x) do { x } while (0)         
    #endif
#else
    #ifndef DBG_ONLY
      #define DBG_ONLY(x) 
    #endif
#endif 
int main () {
    DBG_ONLY(
        std::cout << "yar" << std::endl;
        std::cout << "yar" << std::endl;
        std::cout << "yar" << std::endl;
        std::cout << "yar" << std::endl;
        );
    return 0;
}

如果有像int i,j这样的语句,这将失败。为此,我想我们需要一个可变宏:

#if defined(DEBUG) | defined(_DEBUG)
    #ifndef DBG_ONLY
      #define DBG_ONLY(...) do { __VA_ARGS__; } while (0)
    #endif
#else
    #ifndef DBG_ONLY
      #define DBG_ONLY(...) 
    #endif
#endif 

如果这是"任意"调试代码(与严格的日志记录相反),那么一个粗略的选择是直接的#if/#endif

#if defined(DEBUG) | defined(_DEBUG)
    #define DBG_ONLY
#endif 
...    
#ifdef DBG_ONLY
    // Blah blah blah
#endif

这肯定比@perreal的解决方案更丑,但它避免了任何作用域问题,并在所有语言变体中工作(以及我们还没有想到的任何其他问题!)

也是条件代码,因此有可能严重不同步(因为编译器并不总是检查它)。但对于宏观解决方案也是如此。

还有一个优点;在一个体面的IDE(例如Eclipse CDT)中,您的调试代码将以不同的方式突出显示。