【问题标题】:QT Creator, syntax checking for c++11QT Creator,c++11 的语法检查
【发布时间】:2012-03-22 13:00:03
【问题描述】:

如何为 c++11 基于循环范围的运算符关闭错误突出显示(代码下的红色波浪)?

int myint[] = {1,2,3,4,5};
for (auto x : myint){/**/}

悬停提示显示“意外令牌:”。代码编译完美。

另一个问题 - 自动完成不会在 std:: 命名空间中显示 unique_ptr,但可以编译。

  • Qt Creator 2.4.0 基于 Qt 4.7.4(32 位)于 2011 年 12 月 12 日在 01:10:32

【问题讨论】:

  • 您可能必须全局关闭它才能摆脱它。 Qt Creator 可能不知道 C++11 语法。或者,您可以找到将其设置为 C++11 模式的选项。
  • 它知道 auto、unique_ptr 甚至 lambdas。我的意思是没有红浪并且编译良好。
  • 这并不意味着它知道基于范围的for 语法。
  • 这意味着它知道 c++11 的特性,所以我相信 c++11 模式没有任何额外的选项。
  • 它知道某些功能并不意味着它知道所有功能,不是吗? :) 目前没有任何编译器支持所有 C++11 功能。而这只是一个代码模型解析器。

标签: c++ qt c++11 qt-creator


【解决方案1】:

使用MSVC编译器,需要添加一行:

 /std:c++11

到您项目的project.cxxflags 配置文件,其中project 必须替换为您的项目名称。此文件位于项目目录的根目录下,如果它不存在,您可能需要创建它。

备注:此设置为MSVC parameter,因此其他编译器的语法可能会有所不同。

在 Windows 上使用 Qt Creator 4.15.0-rc1(2021 年 4 月)和 Visual Studio 2017 进行测试,其中错误:

`error: no member named 'optional' in namespace 'std'` when trying to use std::optional from header <optional>

在添加 /std:c++17 时消失(在 C++17 中添加了 std::optional)。

【讨论】:

    【解决方案2】:

    如果您使用 C++11 编写,您应该从使用 QT Creator 作为 IDE 更改为使用 Eclipse CDT。至少这是我解决这个问题的方法。 QT Creator 似乎没有任何方法可以自定义这种实时语法检查。另一方面,Eclipse 在这方面具有广泛的可定制性。

    更新:我认为自从给出这个答案以来,QtCreator 已经改进了对新版本 C++ 的支持,因此它不再正确。我无法删除它,因为它是公认的答案。

    【讨论】:

    • 我应该在这里指出,我最近再次尝试了 QT Creator,它的 C++11 支持似乎有所改进。我不记得这个具体问题是否已解决。
    • 我正要投反对票,但注意到了更新部分。我认为如果放在原始答案之上会更好:不是每个人都足够专注以避免在不阅读整个帖子的情况下投反对票。
    【解决方案3】:

    我不明白安德鲁回答中的推理路线。为什么自定义语法检查有意义?给定编译器命令行设置的上下文,语法要么是正确的,要么是错误的。如果是错误的,应该这样标记,如果不是,不是。如果正确的代码被标记为错误,则它是 IDE 中的错误,或者至少是不受支持的功能,它需要修复,而不是“自定义”。

    说了这么多,举个例子

        int myint[] = {1,2,3,4,5};
        for (auto x : myint){/**/}
    

    在这里工作正常(来自 master 分支的最新版本)。

    关于 Kate 的其他评论:Qt Creator 使用 Kate 的语法高亮作为后备,以防文件没有更具体的语法高亮。在 C++ (98/03/11) 的情况下,使用了一个真实的代码模型,而不是 Kate 的定义。

    【讨论】:

      【解决方案4】:

      有“语法高亮”(着色)和“语法检查”(波浪下划线)。正如@Koying 所建议的那样,语法着色似乎与凯特有关,您可以修改颜色并将其关闭。从 Qt Creator 2.5.0 开始,我从网上粘贴的 大多数 C++11 示例似乎没有问题,尽管您的示例确实仍然有下划线:

      http://labs.qt.nokia.com/2012/05/09/qt-creator-2-5-0-released/

      另外不幸的是,在撰写本文时(2012 年 6 月 13 日,即发布后大约一个月),最新的集成 SDK 包仍默认安装 Qt Creator 2.4.1。 :-/

      如果这是某人所在的船并想尝试最新的,不要像我做的那样通过使用 /opt/QtSDK/SDKMaintenanceTool 清除您的 Qt SDK 安装!重新安装浪费了时间,之后我执行了sudo rm -r /opt/QtSDK/QtCreator,然后告诉新的Qt Creator版本安装到/opt/QtSDK/QtCreator。如果我在这个选择上遇到障碍,我会更新这篇文章!

      http://qt-project.org/wiki/Qt_Creator_Releases

      但是虽然它似乎适用于许多 C++11 构造,但它对您的示例和我遇到的特殊情况(模板的 unspaced&lt;nested&lt;syntax&gt;&gt;)没有任何作用。

      (注意:这似乎是一件小事,但对我来说它是一个很大的 C++11 功能。我讨厌不得不处理 tailspaced&lt;nested&lt;syntax&gt; &gt;...导致我总是在 all 模板上使用fullyspaced&lt; nested&lt; syntax &gt; &gt; 以保持一致。即使是像vector&lt; int &gt; 这样的简单案例。现在他们修复了编译器,我已经准备好消除所有的空白噪音。 )

      似乎没有任何方法可以关闭波浪下划线 (unless you recompile Qt Creator??)。

      in qt-creator-2.5.0-src\src\plugins\cpptools\cppmodelmanager.cpp:
      
              QTextCharFormat errorFormat;
              /* disable error underline
              errorFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline);
              errorFormat.setUnderlineColor(Qt::red);
              */
      
              // set up the format for the warnings.
              QTextCharFormat warningFormat;
              /* disable warning underline
              warningFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline);
              warningFormat.setUnderlineColor(Qt::darkYellow);
              */
      

      无论哪种方式,在 IDE 中复制编译器的工作,而不是让两者共享前端代码,这都是一种疯狂的后果。我们生活在软件的黑暗时代。不会有人save us 吗? [/咆哮]

      这是一些相关的代码(我认为):

      https://qt.gitorious.org/qt-creator/qt-creator/blobs/master/src/plugins/cppeditor/cpphighlighter.cpp

      ...这里的词法分析器,注意成员_cxx0xEnabled

      https://qt.gitorious.org/qt-creator/qt-creator/blobs/master/src/libs/cplusplus/SimpleLexer.cpp#line80

      除了你的 for 语法之外,模板间距是我在 C++11 中发现的唯一导致线条的东西。这对我来说已经足够重要了,我可能会构建自己的 QtCreator 来解决它!

      【讨论】:

        【解决方案5】:

        Qt Creator 使用 Kate 编辑器(来自 KDE)的语法高亮定义。见工具-选项-文本编辑器-通用荧光笔。

        如果 Kate 有 c++11 的定义,您可以使用它,也可以开发自己的。

        【讨论】:

        • 高亮显示没问题,forauto 像往常一样为关键字加粗。解析错误。
        • Kate 语法高亮还可以处理语法,而不仅仅是关键字。最简单的可能是从 c++ 中获取并调整它。
        • 虽然我不确定,因为我有关于 Clang 的红色文章正在由 QT Creator 参与代码模型服务。
        猜你喜欢
        • 2013-05-31
        • 1970-01-01
        • 1970-01-01
        • 2013-07-04
        • 2013-06-01
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        • 2014-12-31
        相关资源
        最近更新 更多