如果没有大括号

我期望下面的代码进行编译。 铿锵和VC ++都给了我一个错误的线。

 void MyFunction(std::int32_t& error) { std::int32_t variable = 0; if(GetSomething()) error = EOK; else error = ERROR; } 

如果我把大括号括在error = EOK; ,然后编译。 为什么VC ++会说:

非法的,如果没有匹配


我的完整代码如下,用typedefreplacestd :: 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; } 

如果你对EOK的定义如下:

#define EOK 0;

那么它会导致这种types的错误,因为它在达到else之前强制终止if语句,使其成为没有匹配的else。 编译器在macrosreplace后看到这个代码:

 if(GetSomething()) error = 0;; else 

这是一个可能的解决方法:

 enum { EOK = 0, ERROR = 5 }; 

请注意,所有以E开头的标识符(后跟另一个大写字母或数字)都将被保留作为<cerrno>macros名称,所以为了避免名称冲突,请考虑针对您的错误使用不同的命名约定。

为了实施并提高效率,您可以:

 error = (GetSomething()) ? 0 : 5 ; 

如果你想像马特所说的那样使用枚举,它将变成:

 error = (GetSomething()) ? enum.EOK : enum.ERROR ;