gpt4 book ai didi

c++ - 当存在 std::map 时,将代码语句作为参数的宏失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:18 25 4
gpt4 key购买 nike

我在代码语句周围使用了一个宏,以引入嵌套异常处理:

#define TRAP_EXCEPTION(statement) \
try \
{ \
try{statement} \
catch(Engine::Exception& e) \
{ \
throw MyException(e.message()); \
} \
}

在一个案例引发编译器错误之前,它一直运行良好。我设法构建了一个最小的例子:

TRAP_EXCEPTION
(
std::map<MyType, bool> Map;
)
catch(MyException& e)
{
}

这会产生以下错误...我该如何修复它(最好是在宏中)?

> error C2143: syntax error : missing '>' before '}'
> error C2976: 'std::map' : too few template arguments
> error C2143: syntax error : missing ';' before '}'

最佳答案

宏不理解模板参数(准确地说是尖括号),它们只看到 , 并认为您向宏提供了两个不同的参数。您需要添加圆括号:

TRAP_EXCEPTION
(
(std::map<MyType, bool> Map;)
)

并且需要更改宏:

#define UNWRAP(...) __VA_ARGS__

#define TRAP_EXCEPTION(statement) \
try \
{ \
try{UNWRAP statement} \
catch(Engine::Exception& e) \
{ \
throw MyException(e.message()); \
} \
}

请注意,这将要求您始终在调用方提供一对额外的圆括号。

在你的情况下(因为宏应该只接受一个语句),你也可以使用可变参数宏:

#define TRAP_EXCEPTION(...) \
try \
{ \
try{ __VA_ARGS__ } \
catch(Engine::Exception& e) \
{ \
throw MyException(e.message()); \
} \
}

这可能更好,因为调用方不会改变并且

TRAP_EXCEPTION
(
std::map<MyType, bool> Map;
)

现在可以正常工作了。

关于c++ - 当存在 std::map 时,将代码语句作为参数的宏失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23292828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com