【问题标题】:Disable Eclipse's error discovery. (Codan false positives)禁用 Eclipse 的错误发现。 (科丹误报)
【发布时间】:2012-11-07 15:30:27
【问题描述】:

到目前为止,我的经验是,Eclipse 的错误发现非常糟糕,没有任何解决方案(在设置的每个点附近都尝试了 __GXX_EXPERIMENTAL_CXX0X__-std=c++0x-std=c++11)。我现在不想再寻找解决方案了。现在我只想查看真正的编译器错误。但是如何做到这一点呢?

【问题讨论】:

  • 你试过this吗?
  • 他们又出现了。
  • 我最近发现了 Qtcreator。除了出色的 qtFramework 之外,IDE 更适合在 linux 上进行 C++ 开发。

标签: c++ eclipse c++11


【解决方案1】:

更新:自从我发布原始答案以来已经很长时间了,它已经过时了。我今天(2014 年 3 月 15 日)仔细检查了:在 Eclipse Kepler(内部版本号 20130614-0229)中足以

  • Project > Properties > C/C++ Build > Settings 下添加,然后在 Tool Settings 选项卡上添加 GCC C++ Compiler > Miscellaneous -std=c++11 标志,

  • 然后在 Discovery 选项卡上的 Window > Preferences > C/C++ > Build > Settings 下选择 CDT GCC Built-in Compiler Settings 和将-std=c++11 标志添加到获取编译器规范的命令。在我的机器上,更改后它看起来像这样:

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

  • 清理并重建您的项目您的索引(Project > C/C++ Index > Rebuild),因为 Eclipse 倾向于缓存错误消息并显示它们尽管更改设置后它们消失了。

这肯定适用于我的机器。如果它不能在你的机器上运行,那么你可能想试一试:C++11 full support on Eclipse 虽然我不确定这是否正确方法也没有必要在我的机器上进行。截至 2014 年 3 月 7 日,用户 claim 表示它对他们有帮助,而上述方法没有。


2012 年的原帖,现已过时:

这些虚假错误来自Codan。我还发布了bug report(C++03 !!!),但同样的问题出现在最新的稳定 Eclipse 中,所以我认为没有发生太多事情:(

解决方法:

点击项目属性,然后C/C++ General > Code Analysis > Syntax and Semantic Errors 并取消选择您遇到的任何错误错误。

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

当然,您可以在那里完全禁用静态分析,这样您就可以完全完成您想要的。


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

【讨论】:

  • 刚重新安装了eclipse,做了一个新项目,花了一段时间,但没有任何改善。我不知道为什么,但我不能在一个充满错误的项目中工作,即使它们是误报。这是阻止这个错误惹恼我的最后机会。谢谢。
  • @DevNoob 如果重新安装 Eclipse,则必须再次禁用静态分析。我个人完全关闭了静态分析,它会产生大量误报。
  • @DevNoob 我不明白你的最后评论。您最终设法摆脱了错误的错误吗?
  • 是的,我摆脱了误报,但不幸的是,阳性也被淘汰了。但现在最好工作。
  • @DevNoob 是的,这也是我所做的,是的,你没有从 Codan 那里得到真正的错误,但只是后来才从编译器那里得到。整件事是因为 Codan 和编译器对 C++ 的理解不同(而 Codan 有问题)。我想知道 clang 是否有任何工作,在这种情况下,同一个程序会进行静态分析和编译,更不用说更好的错误消息了。无论如何,我很高兴你现在可以实际工作!
【解决方案2】:

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

这是我发现的: Project Properties > C++ General > Preprocessor ... > Entries > GNU C++ > CDT GCC Builtin Compiler Settings 将 *__cplusplus=199711L* 作为条目之一。

我修改如下: 在 Window > Preferences > C/C++ > Build > Settings > Discovery 选项卡中选择 CDT GCC Builtin Compiler Settings 并更改 ${COMMAND} -E -P - v -dD ${INPUTS}${COMMAND} -E -P -v -std=c++11 -dD '${INPUTS}'。然后点击应用。 下一次构建后错误消失了。

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

添加更多颜色:

我不是专家,但我认为我的情况是这样的:

Cordian 以多种方式收集错误。

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

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

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

【讨论】:

  • 很奇怪。我正在使用 Juno SR1 (CDT 8.1.1),它有 __cplusplus=1。我在您编写的 Discovery 选项卡上没有任何内容,但正如我所见,您只是将 -std=c++11 标志传递给编译器,所以这无关紧要。奇怪,我看不出它如何解决这个问题。
  • 刚刚看到一个带有 Eclipse Indigo / gcc 4.6.3 的旧盒子,果然 __cplusplus 设置为 1。link 解释了为什么,gcc 有一个在 gcc 4.7 中修复的错误。按照c++11标准应该是201103L。
  • 就我而言,您的说明很好,但我不得不手动重建索引器数据库:项目 -> C/C++ 索引 -> 重建
  • @Ali 静态分析器决定诸如某个符号是否已声明之类的事情。声明可能以宏定义为条件。例如:在 GCC 4.7 中,如果包含 符号 std::uintptr_t 当且仅当 __GXX_EXPERIMENTAL_CXX0X__ 被定义时才被定义。
  • @PedroLamarão 是的,我知道。如果我在 IDE 中设置它,我会假设静态分析器可以访问与编译器完全相同的定义。如果您查看问题,即使在问题中也提到定义了__GXX_EXPERIMENTAL_CXX0X__。无论如何,我在最新的 Eclipse Kepler 中遇到了一堆甚至与 C++11 无关的错误错误。在我看来,他们不应该发布产生如此大量虚假错误的 Eclipse。话虽如此,我仍然使用 Eclipse CDT。
【解决方案3】:

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

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

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

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

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

【讨论】:

    【解决方案4】:

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

  • 转到项目属性->C/C++ 常规->预处理器包括路径、宏等
  • 在“条目”选项卡上选择所需的语言
  • 添加->预处理器宏
  • 输入名称“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。

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

      • 这解决了我在 Eclipse Luna (4.4.1) 上的问题... :)
      • 这是正确答案 -> 也是最简单的。与 Autotools 一起使用也没有问题,并且与开普勒和 luna 一起使用
      猜你喜欢
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2020-03-27
      相关资源
      最近更新 更多