代码块的调试宏
Debug Macro for code block
我试图创建一个宏,执行代码块只有当它是一个调试构建。我已经设法使一个执行一行只有在调试启用,但我不知道如何做一个完整的代码块。
下面是一行宏:
#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)中,您的调试代码将以不同的方式突出显示。
相关文章:
- 调试代码块中的数组
- 使用 ssh 重新连接到远程 Ubuntu 机器后,如何继续使用 gdb 调试 c++ 代码?
- 使用Visual Studio code Ubuntu调试c++代码
- 如何在Mac上从Java拨打的动态库中调试代码
- 在存在调试代码时,如何禁止GIT提交
- 调试C 代码时,访问违规错误
- 调试C++代码:捕获第一个 NaN 外观
- 打开和关闭调试代码的方法
- 调试C++代码
- 用IPython调试C/C++代码
- 漂亮的打印机,用于在Mac OS中使用Eclipse/CDT调试C++代码
- 调试代码并C++未使用的参数警告
- C++ VS 调试代码,请设置自己的调试标志
- 在Linux ubuntu中逐行调试c-c++代码
- 调试代码的运行时间比发布代码长几个数量级
- 使用opencv调试代码失败,并出现分段错误
- 在visualc++中调试代码时,获取argc为零和argv为null
- 带有反调试代码的第三方库
- Visual Studio在调试代码时跳过头文件
- 调试c++代码,涉及使用:vector, string, STL