【问题标题】:define directive with parameter pack gives expecting an expression error带有参数包的定义指令给出了一个表达式错误
【发布时间】:2021-03-23 13:37:31
【问题描述】:

我的 C++ 因不使用而生锈,所以这可能是一个非常微不足道的问题。我在 Visual Studio 2019 上使用 C++ 运行 DLL 项目。我有一个带有参数包的定义指令,如下所示:

#define FUNC(...)              \
    try                        \
    {                          \
        (__VA_ARGS__);         \
    }                          \
    catch (std::exception & e) \
    {                          \
        LOG("error: %s", e);   \
        return STATUSERROR;    \
    }                          \
    return STATUSOK;

这在我打电话时有效:

 FUNC( i = 0);

但是当我尝试调用以下内容时,它会抛出错误“预期的表达式”

FUNC({
     if(some_statement){
         return something;
     }
     return something_else;
});

我使用 \ 作为行继续转义字符,因此问题不源于此。我已经用 C++ 14 和 17 编译了它。这里可能缺少什么?

【问题讨论】:

  • 您的宏声明缺少很多反斜杠。现在它将FUNC 定义为空,然后将try/catch 放入我假设的全局范围内。
  • 反斜杠实际上是存在的,但是 stackoverflow 没有渲染它们,经过多次尝试我无法使它们可见
  • 我已经修好了,AFAICT。

标签: c++ macros preprocessor


【解决方案1】:

您的宏调用扩展为({ /* stuff */ });,这是无效的语法。可能代码最初是用 GCC 编译的,它以extension 的形式提供。

您应该从宏扩展中删除括号和分号,留下 __VA_ARGS__ 自己来填充封闭范围。

【讨论】:

  • 感谢您之前使用 GCC 编译它是正确的,我进行了更改并且它有效!谢谢!
【解决方案2】:

毫无疑问,昆汀是正确的。将宏更改为

#define FUNC(...)              \
try                        \
{                          \
    __VA_ARGS__            \
}                          \
catch (std::exception & e) \
{                          \
    LOG("error: %s", e);   \
    return STATUSERROR;    \
}                          \
return STATUSOK;

然后像这样使用它

FUNC(
 if(some_statement){
     return something;
 }
 return something_else;
);

使用 (gcc version = 10.2.0) gcc -E file.cpp 进行预处理并手动重新格式化以提高可读性

 try { 
    if(some_statement){ 
       return something; 
 } 
 return something_else; 
} 
catch (std::exception & e) 
{ 
  LOG("error: %s", e); return STATUSERROR; 
}
return STATUSOK;

但我仍然讨厌宏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多