禁用Eclipse的错误发现。 (Codan误报)

时间:2012-11-19 16:49:10

标签: c++ eclipse c++11

直到现在我的经验是,Eclipse的错误发现在没有任何解决方案的情况下非常麻烦(在设置的每个点附近尝试__GXX_EXPERIMENTAL_CXX0X__-std=c++0x-std=c++11。我不想再寻找解决方案了。现在我只想看到真正的编译器错误。但是如何实现这个目标呢?

5 个答案:

答案 0 :(得分:20)

更新:自从我发布原始答案后已经很久了,它已经过时了。我今天仔细检查了(2014年3月15日):在Eclipse Kepler(Build id 20130614-0229)中就足够了

  • 项目>下添加属性> C / C ++ Build>设置然后在工具设置选项卡上 GCC C ++编译器>杂项 -std=c++11标志,

  • 然后在 Window&gt;下偏好&gt; C / C ++&gt;构建&gt; Discovery 选项卡上的设置选择了 CDT GCC内置编译器设置,并将-std=c++11标志添加到命令以获取编译器规范< / em>的。在我的机器上,在更改后它看起来像这样:

    ${COMMAND} -E -P -v -dD -std=c++11 "${INPUTS}"

  • 清理并重建您的项目您的索引(项目&gt; C / C ++索引&gt;重建),因为Eclipse倾向于缓存错误消息并显示即使它们在更改设置后消失了。

这肯定会在我的机器上运行。如果它不在您的机器上,那么您可能想对此进行一次拍摄:C++11 full support on Eclipse虽然我不确定这种方法的正确性也没有必要在我的机器上进行。截至2014年3月7日,用户claim表示它帮助了他们,而上述方法并没有。


2012年的原帖,现已过时:

<击> 这些虚假错误来自Codan。我也发了一个bug report(C ++ 03 !!!)但同样的问题出现在最新稳定的Eclipse中,所以我不会想到已经发生了很多事情:(

<击>

解决方法:

单击项目属性,然后单击 C / C ++ General&gt;代码分析&gt;语法和语义错误并取消选择您获得的任何错误错误。

  

我只想看到真正的编译器错误

当然,您可以完全禁用静态分析,在这种情况下,您可以完全按照自己的意愿完成。


更新: 2位用户报告说Jeevaka所写的内容帮助了他们。我试过他写的东西,它对Juno SR1和CDT 8.1.1没有帮助。也许Codan开发人员改进了Juno SR2和CDT 8.1.2中的静态分析

<击>

答案 1 :(得分:6)

我对c ++ 11代码的Cordian错误感到困扰,这些错误在gcc中完美编译并启用了所有警告。我发现我认为是根本原因,至少在我的情况下。很少有关于c ++ 11的Cordian错误的其他问题被关闭作为这个问题的重复,并指向这个问题。所以我虽然会在这里发布我的答案。

这是我发现的: 项目属性&gt; C ++一般&gt;预处理器...&gt;参赛作品&gt; GNU C ++&gt; CDT GCC内置编译器设置将* __ cplusplus = 199711L *作为其中一个条目。

我改变如下: 在窗口&gt;偏好&gt; C / C ++&gt;构建&gt;设置&gt;发现选项卡已选择 CDT GCC内置编译器设置并将 $ {COMMAND} -E -P -v -dD $ {INPUTS} 更改为 $ { COMMAND} -E -P -v -std = c ++ 11 -dD'$ {INPUTS}'。然后点击Apply。 下次构建后错误消失了。

我正在使用带有CDT 8.1.2的Juno SR2和手工制作的文件。

添加更多颜色:

我不是专家,但这就是我认为在我的案例中发生的事情:

Cordian以多种方式收集错误。

一个是解析编译器输出。我的Makefile中的-std=c++11确保这部分一直正常,因为通过终端调用相同的Makefile没有标记任何错误。

另一种是通过'代码分析'。为此,可能还有其他任务,Ecplise需要知道编译器将使用的设置。 Eclipse通过调用上面编辑的命令并解析输出来找到它们。在点击“应用”之前勾选“控制台视图中的分配控制台”,可以查看此命令的输出。这些设置包括包含目录和定义,如__cplusplus。当这些匹配gcc在通过我的Makefile调用时会使用的结果是一致的。

当我在头文件中使用#pragma message试验问题时,我认为__GXX_EXPERIMENTAL_CXX0X__是错误的,并且看到了一些手动设置的在线建议,但这似乎也是一种解决方法。

答案 2 :(得分:5)

在全新的Eclipse安装中,触发一个宏并重建索引解决了它:

项目 - &gt;属性 - &gt;预处理器包含 选择GNU C ++ 选择CDT用户设置条目 按添加

并添加名为__cplusplus且值为201103L的预处理器宏。

最后,重建索引。 (项目 - &gt; C / C ++索引 - &gt;重建)

答案 3 :(得分:1)

您还可以通过以下步骤从CDT范围中删除有问题的代码部分:

  • 转到项目属性 - &gt; C / C ++ General-&gt;预处理器包括路径,宏等
  • 在“条目”标签上选择所需的语言
  • 添加 - >预处理器宏
  • 输入名称“MY_CODAN_MACRO”,输入值“1”
  • 现在你可以写:

    #idndef MY_CODAN_MACRO
    // this code is visible by compiler only
    #else
    // this code is visible by code analysis and CDT, but not visible by compiler
    #endif
    

    我认为这个技巧在Indigo +中是可行的。我正在使用Juno。

    答案 4 :(得分:-1)

    我意识到问题是很久以前问的,但由于问题仍然存在(我使用Kepler并得到相同的错误),我将发布另一种可能的解决方法。

    可以创建单独的源文件并重新定义他想要在那里使用的函数(例如,通常的命名空间)。在我创建了这样的函数之后

    std::string to_string(long long num) {
        return std::to_string(num);
    }
    

    并开始在主要来源中使用to_string而不是std::to_string(我添加额外的一个包含)eclipse不再将代码标记为错误。

    当然,错误会在额外的包含中标记,但它不包含逻辑,所以你甚至不看那里。