我在 C++ 中使用这个定义来调试我的变量,它在 clion 和 codeblocks 中工作,但在 Visual Studio 22 中不起作用。
错误 C2010 '.':宏参数列表 codeforces 中出现意外
文件名为“codeforces”
#define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }
void err(istream_iterator<string> it) {}
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
cerr << *it << " = " << a << endl;
err(++it, args...);
}
我使用下面的代码,但如果有很多变量,它就不起作用,因为我需要复制粘贴很多
#define error(s) cout << #s << " = " << s << endl;
如何解决这个问题?
正确的预处理器语法对于参数来说是
...
,对于其扩展来说是 __VA_ARGS__
:
#define error(...) \
{ \
string _s = __VA_ARGS__; \
replace(_s.begin(), _s.end(), ',', ' '); \
stringstream _ss(_s); \
istream_iterator<string> _it(_ss); \
err(_it, __VA_ARGS__); \
}
但是将其与多个参数一起使用...
error("Hello", "world")
...将导致
string _s = __VA_ARGS__;
扩展为
string _s = "Hello", "World";
我不确定预期的输出是什么,但使用带有参数包的纯 C++ 函数模板应该很容易修复,而不是涉及可变参数宏。