带有参数包的 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;
但我还是讨厌宏
我的 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;
但我还是讨厌宏