如果没有大括号
我期望下面的代码进行编译。 铿锵和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 ;