我希望编译以下代码.Clang和VC++都给我一个错误else
.
void MyFunction(std::int32_t& error)
{
std::int32_t variable = 0;
if(GetSomething())
error = EOK;
else
error = ERROR;
}
Run Code Online (Sandbox Code Playgroud)
如果我把花括号括起来error = EOK;
,那就编译.为什么VC++说:
非法的其他没有匹配if
?
我的完整代码如下,用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;
}
Run Code Online (Sandbox Code Playgroud)
T.W*_*ole 94
如果您对EOK的定义如下:
#define EOK 0;
然后它会导致这种类型的错误,因为它在到达else之前强制终止if语句,使其成为没有匹配if的else.编译器在宏替换后看到此代码:
if(GetSomething())
error = 0;;
else
Run Code Online (Sandbox Code Playgroud)
M.M*_*M.M 15
这是一个可能的解决方案:
enum
{
EOK = 0,
ERROR = 5
};
Run Code Online (Sandbox Code Playgroud)
请注意,所有以后E
跟另一个大写字母或数字开头的标识符都保留用作宏名称<cerrno>
,因此为了避免名称冲突,请考虑对错误使用不同的命名约定.