带有参数包的 define 指令给出预期的表达式错误

define directive with parameter pack gives expecting an expression error

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

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

这在我打电话时有效:

 FUNC( i = 0);

但是当我尝试调用以下内容时,它会抛出错误“expected an expression”

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

我使用 \ 作为行继续转义字符,因此问题并非源于此。我用 C++ 14 和 17 编译了这个。我可能在这里遗漏了什么?

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

的形式提供

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

不出所料,昆汀是正确的。将宏更改为

#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 版本 = 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;

但我还是讨厌宏