单行调试宏
One line debug macro
我想创建一个C++宏函数来调试,我希望它能像这样工作:
int main(){
int a = 3, b = 5, c = 7;
string s = "<";
print(a,s,b);
print(a,s,b,s,c);
}
OUTPUT:
3 < 5
3 < 5 < 7
我读过很多关于可变宏的文章,但我试图编写的任何代码都根本不起作用。
我曾想过使用lambda,但没有想出算法
我需要它就像一行代码,因为它只是用于调试,除此之外,我可以创建一个更复杂的函数,但我想这一定是可能的。。。
如果您同意将分隔符替换为'<<
'(而不是',
'),则宏很容易定义(但请注意,print
不是宏的好名称,这就是我适当重命名它的原因):
#include <iostream>
#include <string>
#ifdef DEBUG
#define DEBUG_PRINT(x) std::cout << x << std::endl
#else
#define DEBUG_PRINT(x)
#endif
int main(){
int a = 3, b = 5, c = 7;
std::string s = "<";
std::cout << "START" << std::endl;
DEBUG_PRINT(a << s << b);
DEBUG_PRINT(a << s << b << s << c);
std::cout << "END" << std::endl;
return 0;
}
输出:
$ g++ -DDEBUG main.cpp && ./a.out
START
3<5
3<5<7
END
$ g++ main.cpp && ./a.out
START
END
您可以使用可变模板而不是MACRO:
template <typename ... Ts>
void print(Ts&&... args)
{
int dummy[] = {0, ((std::cout << args), 0)...};
static_cast<void>(dummy); // avoid warning for unused variable
std::cout << std::endl;
}
或在c++17 中
template <typename ... Ts>
void print(Ts&&... args)
{
(std::cout << ... << args) << std::endl;
}
我几乎实现了我想要的(用2行代码):
#define print(args...) {db,args; cerr<<endl;}
struct dbg{template<typename T> dbg& operator , (const T& v){cerr<<v<<" "; return *this; }} db;
现在我可以打印(1,2,"asjd"),它可以很好地进行
相关文章:
- 当回溯以零开始时,如何调试崩溃
- QAbstractTableModel,并为单行发出dataChanged
- Visual Studio 2019:插入多个C++风格的单行注释
- 在linux上调试巨大的C++项目
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 正在VS调试器中监视映射条目
- 使用调试/崩溃报告将应用程序部署到客户端
- VC++本机单元测试,找不到调试符号
- 如何在C++生成器中禁用"使用调试.dcus"
- 使用vscode调试时,GDB意外退出
- 即使使用调试编译标志,表达式也是"optimized out"
- 调试 CUDA MMU 故障
- 小字符串优化(调试与发布模式)
- 调试和自由执行中的信号处理
- 调试编译的服务器在数据库打开时崩溃
- Visual Studio 调试优化如何工作?
- 如何配置Visual Studio Code以使用cygwin,cmake和gcc进行调试
- 通过调试来检查C 中单行表达式执行顺序的方法
- 单行调试宏