Visual Studio 2015 中的宏参数限制

Posted

技术标签:

【中文标题】Visual Studio 2015 中的宏参数限制【英文标题】:Macro parameter restrictions in Visual Studio 2015 【发布时间】:2015-10-02 11:28:37 【问题描述】:

我正在使用 Visual Studio 2015 将一些使用 gcc 在 linux 中构建的代码移植到 Windows。

在 VS 中,当使用带有参数“+=”的宏 DEFOP 时,出现错误 error C2059: syntax error: '+=',与其他参数相同。这是代码:

#define DEFOP(OP) \
    Matrix& Matrix::operator OP (const double& val)  \
        for (int i = 0; i < _n; i++)  \
            _data[i] OP val; \
         \
    return *this; \
     \
    Matrix& Matrix::operator OP (const Matrix& that)  \
    if (_rows != _rows || _cols != that._cols)  \
            throw Exception (String ( \
                "Matrix size mismatch in operation '%s': " \
        "(%d,%d) vs. (%d,%d).", \
                __STRING(OP), _rows, _cols, that._rows, that._cols)); \
     \
        for (int i = 0; i < _n; i++)  \
            _data[i] OP that._data[i]; \
         \
    return *this; \
    
DEFOP(+=);
DEFOP(-=);
DEFOP(*=);
DEFOP(/=);
#undef DEFOP

有人知道如何修改这段代码以便在 VS 中构建吗?

【问题讨论】:

如果将__STRING(OP) 替换为#OP 会怎样? 我不会以这种方式使用宏。一开始很难调试。为什么不直接写出代码。操作简单,所有编辑器都有搜索和替换功能。 PS:_rows != _rows 是一个开始的错误 #OP 工作!我想知道这种相同的语法是否适用于 gcc。该代码也旨在构建在 gcc 中。 @SingerOfTheFall 如果您将此作为答案,我会接受。 所以这个“第三方”给你的代码不能编译?似乎比较奇怪。为什么不让他们修复它? 【参考方案1】:

由于__STRING 是一个非标准宏,并非所有编译器都接受它。将宏参数用作字符串文字的常用方法是使用#,即您应该将__STRING(OP) 替换为#OP

【讨论】:

以上是关于Visual Studio 2015 中的宏参数限制的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2015 调试中将“%”符号作为命令行参数 (argv) 传递?

按值传递的参数在 Visual Studio 2015 x64 调试器中显示不正确?

Visual Studio 2015 中的“无法引用默认构造函数”

Visual Studio 2015/2017 中的 TSLint?

Visual Studio 2015 中的递归包含路径

Visual Studio 2015 远程调试(联调)