如果没有括号

时间:2014-10-06 19:58:08

标签: c++ if-statement

我希望编译以下代码。 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;
}

3 个答案:

答案 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 ;