如何让 Xcode 3.1 编译器在 if 语句中警告赋值运算符?

How to have the Xcode 3.1 compiler warn of assignment operator in an if statement?

提问人:Rob 提问时间:9/10/2009 更新时间:9/10/2009 访问量:835

问:

我已经尝试尽可能地搜索文档和互联网,但是如果在 if 语句中使用赋值运算符,我无法让 Xcode 编译器发出警告。

我来自RealBasic,在那里我有一个非常强烈的习惯,就是输入这种比较:

if x = 5 then ...

当然,在 C 语言中,该语法将 x 的值分配为 5,然后测试结果以查看它是否为非零,并且“正确”运算符为:

if (x == 5) { ... }

我发现有几次提到编译器应该能够警告是否在 if 比较中进行了赋值,但我找不到如何在 Xcode 3.1/gcc 中打开它。我找到了这个选项,但这似乎没有生成警告。-pedantic

由于我已经花了相当多的时间两次来追踪结果是“=”而不是“==”的错误,因此我希望得到警告的帮助。

我知道我可以这样做(这将导致编译器错误):

if (5 = x) { ... }

...但这也需要改变根深蒂固的编码习惯。更不用说它看起来笨拙和落后。

谢谢!

xcode 编译器构造 if-语句 赋值运算符

评论


答:

1赞 Glen 9/10/2009 #1

我认为您正在寻找 -Wall 选项。

int main(void) {

    int x = 5;
    if ( x=5) { 
    }
    return 0;
  }

$ g++ -pedantic x.cc 
$ g++ -Wall x.cc 
x.cc: In function ‘int main()’:
x.cc:7: warning: suggest parentheses around assignment used as truth value

链接介绍如何通过 Xcode GUI 启用选项

1赞 Rob 9/10/2009 #2

ennuikiller 回答中的链接确实导致了我需要的东西。

对于将来可能会发现此内容的任何人,这里有一些更多信息:

  • 编译器警告为“缺少大括号和括号”或 -Wparentheses。

  • 通过选择当前 Xcode 中的目标。

  • 正如我最终发现的那样,iPhone Simulator SDK没有显示 此编译器选项。

  • 将 SDK 切换到 iPhone 设备将显示 GCC 4.2 警告 部分,其中包括“缺失 大括号和括号”。

  • 在 iPhone 设备 SDK 中打开该选项后,切换回去 到 Similator 显示 “用户定义”构建设置已被 添加:= “是的”。GCC_WARN_MISSING_PARENTHESES

  • 如果确实需要在 if 语句中赋值,则可以 将括号加倍以避免警告。

(双括号示例:)

if ((x = 5)) { ... }

这个警告就像一个魅力,尽管它确实不喜欢苹果的标准:

if (self = [super init]) { ... }

我可能会保持原样,但如果我最终在一个项目中有大量的它们,我要么将括号加倍,要么将任务分解为单独的一行。

谢谢!

评论

0赞 João Portela 2/25/2011
那面旗帜对我不起作用。我有这个代码:尽管启用了该标志,但 xcode/g++ 不会发出警告。(注意:C++ 代码。if (newlyCreated = true) { goToLastElement = true; }