【问题标题】:How to have the Xcode 3.1 compiler warn of assignment operator in an if statement?如何让 Xcode 3.1 编译器在 if 语句中警告赋值运算符?
【发布时间】:2010-11-27 04:48:40
【问题描述】:

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

我来自 RealBasic,在那里我养成了输入这种比较的非常强烈的习惯:

if x = 5 then ...

当然,在 C 中,该语法将 x 赋值为 5,然后测试结果是否为非零,“正确”运算符是:

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

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

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

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

if (5 = x) { ... }

...但这也需要改变根深蒂固的编码习惯。更别提它看起来笨拙落后了。

谢谢!

【问题讨论】:

    标签: xcode compiler-construction if-statement assignment-operator


    【解决方案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
    

    link 描述了如何通过 Xcode GUI 启用选项

    【讨论】:

      【解决方案2】:

      ennukiller 的答案中的链接确实导致了我需要的内容。

      这里有更多信息供将来可能会发现此内容的任何人使用:

      • 编译器警告是“缺少大括号和括号”,或 -W括号。

      • 通过选择获取当前的信息来打开警告 Xcode 中的目标。

      • 我终于发现,iPhone Simulator SDK 确实显示 这个编译器选项。

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

      • 在 iPhone 设备 SDK 中打开该选项后,切换回来 到 Simulator 表明一个 “用户定义”构建设置已 添加: GCC_WARN_MISSING_PARENTHESES = “是”。

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

      (双括号示例:)

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

      警告就像一个魅力,虽然它确实不喜欢 Apple 的标准:

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

      我可能会保持原样,但如果我最终在一个项目中使用大量它们,我会将括号加倍或将作业分成单独的一行。

      谢谢!

      【讨论】:

      • 那个标志对我不起作用。我有这个代码:if (newlyCreated = true) { goToLastElement = true; },尽管启用了该标志,但 xcode/g++ 不会发出警告。 (注意:C++ 代码。)
      猜你喜欢
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      相关资源
      最近更新 更多