'。'宏参数列表中出现意外,在`#define error(args...)`中

问题描述 投票:0回答:1

我在 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;

如何解决这个问题?

c++ windows visual-studio c-preprocessor
1个回答
0
投票

正确的预处理器语法对于参数来说是

...
,对于其扩展来说是
__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++ 函数模板应该很容易修复,而不是涉及可变参数宏。

© www.soinside.com 2019 - 2024. All rights reserved.