如果没有括号

Gra*_*rak 39 c++ if-statement

我希望编译以下代码.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)

  • 呃,以分号结尾的宏.纯粹的邪恶. (60认同)
  • 理由#245为什么没有括号的控制语句只是*要求*麻烦... (27认同)
  • 更好的是使用常量而不是宏! (17认同)

M.M*_*M.M 15

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

enum
{
    EOK = 0,
    ERROR = 5
};
Run Code Online (Sandbox Code Playgroud)

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

  • 更好地使一个类枚举更好的名称间距,然后它不必始终与E开始:D (2认同)