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 没有大括号的主要内容,如果未能解决你的问题,请参考以下文章