if 和 else 没有大括号

Posted

技术标签:

【中文标题】if 和 else 没有大括号【英文标题】:if and else without braces 【发布时间】:2014-10-06 19:58:07 【问题描述】:

我希望以下代码能够编译。 Clang 和 VC++ 都在else 的行上给我一个错误。

void MyFunction(std::int32_t& error)

   std::int32_t variable = 0;
   if(GetSomething())
      error = EOK;
   else
      error = ERROR;

如果我在error = EOK; 周围加上花括号,那么它会编译。为什么VC++会说:

不匹配 if 的 else 非法

?


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

【问题讨论】:

我闻到一只大老鼠的味道。 什么是 EOK(或 GetSomething)?也许是一些奇怪的宏定义 这是不应该使用宏的众多例子之一。 @bames53 更重要的是,一个示例说明为什么应该在 if-else 受控语句周围使用大括号... @silvo:这是一个损坏的宏定义,与需要大括号没有任何关系。你也会从error = GetSomething() ? EOK : ERROR; 那里得到一个编译错误,而且没有办法把大括号放进去。 【参考方案1】:

如果你对 EOK 的定义如下:

#define EOK 0;

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

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

【讨论】:

最好使用常量而不是宏! 呃,以分号结尾的宏。纯粹的邪恶。 原因 #245 为什么没有大括号的控制语句只是麻烦... 一般来说,您可以通过显式检查预处理文件来调试预处理器问题 - 在 VC 中,使用 CL /P/E。 @sapi:你仍然可能被#define EOK 0 挫败——尽管可能性要小得多。【参考方案2】:

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

enum

    EOK = 0,
    ERROR = 5
;

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

【讨论】:

最好将其设为类枚举以获得更好的名称间距,这样它就不必一直以 E 开头:D【参考方案3】:

为了简单高效,您可以这样做:

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

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

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

【讨论】:

* 错误 = (GetSomething()) ? enum.EOK : enum.ERROR ; 我对您声称这样更有效的说法提出异议。编译器应该生成相同的代码。 Sebastian ,一行代码对于编译器和开发人员来说更容易(同时也是复杂的一面;)) 一行代码对开发人员来说并不容易——这取决于行的复杂程度。对于编译器来说,这绝对不是一件容易的事 - 编译器将它解析成树,优化器和代码生成器使用它,如果不是一个更重的处理形式。

以上是关于if 和 else 没有大括号的主要内容,如果未能解决你的问题,请参考以下文章

Java流程控制

php if语句没有中括号 那表示的是啥意思

JAVA的if用法,比如if(...){} 和if()没有大括号直接写下面的区别是什么

编程规范

条件语句示例

java开发手册-编程规约-代码格式