我希望编译以下代码。 Clang和VC ++都使用else
给我一个错误。
void MyFunction(std::int32_t& error)
{
std::int32_t variable = 0;
if(GetSomething())
error = EOK;
else
error = ERROR;
}
如果我在error = EOK;
周围放置花括号,那么它就会编译。为什么VC ++会说:
非法其他,如果没有匹配
我的完整代码如下,用typedef替换std :: uint32_t。它仍然在VC ++中给出了相同的错误。
using sint32 = int;
#define ERROR 5;
#define EOK 0;
bool GetSomething();
void MyFunction(sint32& error)
{
sint32 variable = 0;
if (GetSomething())
error = EOK;
else
error = ERROR;
}
答案 0 :(得分:94)
如果您对EOK的定义如下:
#define EOK 0;
然后它会导致这种类型的错误,因为它在到达else之前强行终止if语句,使其成为没有匹配if的else。编译器在宏替换后看到此代码:
if(GetSomething())
error = 0;;
else
答案 1 :(得分:15)
这是一个可能的解决方法:
enum
{
EOK = 0,
ERROR = 5
};
请注意,所有以E
开头,后跟另一个大写字母或数字的标识符都保留为<cerrno>
用作宏名称,因此为了避免名称冲突,请考虑为您使用不同的命名约定错误。
答案 2 :(得分:0)
要实现并提高效率,您可以:
error = (GetSomething()) ? 0 : 5 ;
如果你想和马特说的那样,那就变成了:
error = (GetSomething()) ? enum.EOK : enum.ERROR ;