带有参数包的define指令应出现表达式错误 我的C++由于不使用而生锈,所以这可能是个很小的问题。我在Visual Studio 2019上运行C++的DLL项目。我有一个带有参数包的define指令,如下所示: #define FUNC(...) \ try \ { \ (__VA_ARGS__); \ } \ catch (std::exception & e) \ { \ LOG("error: %s", e); \ return STATUSERROR; \ } \ return STATUSOK;

带有参数包的define指令应出现表达式错误 我的C++由于不使用而生锈,所以这可能是个很小的问题。我在Visual Studio 2019上运行C++的DLL项目。我有一个带有参数包的define指令,如下所示: #define FUNC(...) \ try \ { \ (__VA_ARGS__); \ } \ catch (std::exception & e) \ { \ LOG("error: %s", e); \ return STATUSERROR; \ } \ return STATUSOK;,c++,macros,preprocessor,C++,Macros,Preprocessor,当我打电话给: FUNC( i = 0); 但是当我尝试调用下面的函数时,它抛出了一个错误“expected a expression” 我使用\作为行继续转义字符,因此问题不会由此产生。我已经用C++ 14和17编译了这个。这里可能缺少什么?您的宏调用扩展为({/*stuff*/}),这是无效的语法。可能代码最初是用GCC编译的,GCC提供了一个 您应该从宏展开中删除括号和分号,让\u VA\u ARGS\u\u自己填充封闭范围。昆廷的正确性并不令人惊讶。将宏更改为 #define FUN

当我打电话给:

 FUNC( i = 0);
但是当我尝试调用下面的函数时,它抛出了一个错误“expected a expression”


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

您的宏调用扩展为
({/*stuff*/}),这是无效的语法。可能代码最初是用GCC编译的,GCC提供了一个


您应该从宏展开中删除括号和分号,让
\u VA\u ARGS\u\u
自己填充封闭范围。

昆廷的正确性并不令人惊讶。将宏更改为

#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;

但是我仍然讨厌宏。

您的宏声明缺少很多反斜杠。现在它将
FUNC
定义为nothing,然后将
try
/
catch
放入我假设的全局范围。反斜杠实际上在那里,但stackoverflow没有呈现它们,在多次尝试后,我无法使它们可见。我已经修复了它,AFAICT。谢谢你说的对,它是用GCC编译的。之前,我做了修改,它成功了!谢谢
 try { 
    if(some_statement){ 
       return something; 
 } 
 return something_else; 
} 
catch (std::exception & e) 
{ 
  LOG("error: %s", e); return STATUSERROR; 
}
return STATUSOK;