带有参数包的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;