【问题标题】:C11 and C++11 problems in Sublime Text 3Sublime Text 3 中的 C11 和 C++11 问题
【发布时间】:2014-06-19 11:59:45
【问题描述】:

我为 C/C++ 升级了我的 Sublime Text 3,但我必须用 C11 和 C++11 等现代版本编写代码。

当我尝试这样的 C11 代码时:

#include <stdio.h>

int main( int argc, char ** argv )
{
    puts("C99 Version:");

    for( int i = 0; argv[i]; i++ ) {
        printf("%d: %s\n", i, argv[i]);
    }
    getchar();
    return 0;
}

Sublime 报错:

C:\Users\pc\Desktop\CPPproject\c99.c:7:2: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
  for( int i = 0; argv[i]; i++ ) {
  ^
C:\Users\pc\Desktop\CPPproject\c99.c:7:2: note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code

您能解释一下如何使用 -std=c99、-std=gnu99、-std=c11 或 -std=gnu11 选项吗?

================================================ ====================================

与 C++11 相同。代码如下:

#include <iostream>
#include <sstream>
#include <vector>
using namespace std;

int main( int argc, char ** argv ) {

    stringstream version;
    version << "GCC version: "
            << __GNUC__ << "." << __GNUC_MINOR__ << "." << __GNUC_PATCHLEVEL__
            << "\nVersion string: " << __VERSION__;

    cout << version.str() << endl;

    vector<string> v = { "one", "two", "three" }; // C++11 feature - initializer list

    for( string s : v ) {   // C++11 feature - range-based for loop
        cout << s << endl;
    }

    return 0;
}

以及错误列表:

C:\Users\pc\Desktop\CPPproject\main.cpp: In function 'int main(int, char**)':
C:\Users\pc\Desktop\CPPproject\main.cpp:17:45: error: in C++98 'v' must be initialized by constructor, not by '{...}'
  vector<string> v = { "one", "two", "three" }; // C++11 feature - initializer list
                                             ^
C:\Users\pc\Desktop\CPPproject\main.cpp:17:45: error: could not convert '{"one", "two", "three"}' from '<brace-enclosed initializer list>' to 'std::vector<std::basic_string<char> >'
C:\Users\pc\Desktop\CPPproject\main.cpp:19:18: error: range-based 'for' loops are not allowed in C++98 mode
  for( string s : v ) { // C++11 feature - range-based for loop
                  ^

请帮我解决这些问题!

还有一个问题:当我运行代码时 - .exe 文件与源代码出现在同一个文件夹中,我必须打开它。当我单击“ctrl+b”时,是否有可能在 Sublime Text 中看到输出???

谢谢!!!

【问题讨论】:

  • Sublime Text 本身没有编译器或语法检查器,它必须在您已安装的模块中。检查该模块的配置文件。
  • @JoachimPileborg 误导。这是一个无需安装任何东西即可轻松解决的问题。 Sublime Text 确实有构建系统(即在文件或项目上运行的命令)。 Luchnik 只需要配置它们。
  • Here's the documentation 在 ST3 构建系统上。为每个包含适当 -std 标志的 C 和 C++ 创建一个新的。

标签: c++ c c++11 sublimetext2 sublimetext3


【解决方案1】:

如 cmets 中所述,您需要更改的是您的构建系统。我 ST3 修改默认包有点棘手。有插件可以做到这一点,但我还没有使用它们。这是一种免费的插件方式。

首先,您需要一个新的.sublime-build。我认为这个应该可以。

{
    "cmd": ["g++", "-std=c++11", "-o", "${file_path}/${file_base_name}", "${file}"],
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++",

    "variants":
    [
        {
            "name": "Run",
            "cmd": ["bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
        },
        {
            "name": "Build without C++11",
            "cmd": ["g++ '${file}' -o '${file_path}/${file_base_name}'"]
        }
    ]
}

然后,您需要导航到存储 ST3 的默认包的位置。看来您正在使用 Windows。 .sublime-packages 的位置可能类似于 C:\Program Files\Sublime Text 3\Packages。

进入此文件夹后,您应该会看到一堆 .sublime-package 文件,其中包含所有内置支持的语言的名称。选择C++.sublime-package 并将其复制到其他目录。然后,将其重命名为C++.zip 并解压缩。删除C++.sublime-build 文件并将其替换为包含上述代码的同名文件。重新压缩文件并将其重命名为 C++.sublime-package 并将其放回您从中获取它的文件夹中。

现在:

  • 当您按下 ctrl+b 时,ST3 将使用 gcc 的 C++11 标志自动构建。
  • 如果你想运行你的程序(我认为这就是你所说的“查看 Sublime Text 中的输出”的意思),在程序编译后按 ctrl+shift+b。
  • 如果您想使用 gcc 但没有 C++11 标志,请按 ctrl+shift+p 并输入“Build: Build without C++11”并选择选项弹出。

【讨论】:

  • 您不必修改“.sublime-package”文件。相反,您可以将新的“C++.sublime-build”文件放在用户包文件夹中的一个子文件夹中,也称为“C++”。在我的情况下,文件在这个位置'....\SublimeText\Data\Packages\User\C++\C++.sublime-build'。
  • 我想知道第一个命令行数组的最后一项是否有错字("${file}"")。
  • @SwiftsNamesake 是的,看起来像是放错了引号。固定。
  • @Alec : 最后一行缺少双引号。一旦修复它就可以完美运行!
  • @sookie 谢谢!固定。
【解决方案2】:

有时当你这样做时,你可能会遇到一个错误,比如语法错误,或者其他类型的错误,以避免所有使用标准 C++ 配置的错误,只需在 g++ 后添加关键字 -std=c++11 即可shell_cmd 示例

{
    "shell_cmd": "g++ -std=c++11 \"${file}\" -o \"${file_path}/${file_base_name}\"",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++",

    "variants":
    [
        {
            "name": "Run",
            "cmd": ["bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
        },
        {
            "name": "Build without C++11",
            "cmd": ["g++ '${file}' -o '${file_path}/${file_base_name}'"]
        }
    ]
}

这样就行了。 C++98 是没有 -std=c+11 选项的相同配置。

有关如何处理此类文件的更多信息,请前往sublime documentation about build systems

【讨论】:

    【解决方案3】:

    Alec 的解决方案对我来说效果很好,但是名为“Run”的运行变体无法使用 C++11 构建,因此我添加了一个名为“Run with C++11”的运行选项:

    {
        "cmd": ["g++", "-std=c++11", "-o", "${file_path}/${file_base_name}", "${file}"],
        "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
        "working_dir": "${file_path}",
        "selector": "source.c, source.c++",
    
        "variants":
        [
            {
                "name": "Run",
                "cmd": ["bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
            },
        {
                "name": "Run with C++11",
                "cmd": ["bash", "-c", "g++ '${file}' -std=c++11 -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
            },
            {
                "name": "Build without C++11",
                "cmd": ["g++ '${file}' -o '${file_path}/${file_base_name}'"]
            }
        ]
    }
    

    【讨论】:

      【解决方案4】:

      Sublime Text 3 更难修改默认设置;要更改它们,您可以使用包“PackageResourceViewer”。安装这个包(推荐PackageControl),然后按Ctrl+shift+P并执行命令:

      PackageResourceViewer:OpenResource -> C++ -> C++ Single File.sublime-build

      在您找到的每个“g++”命令之后添加选项“-std=C++11”。保存并关闭文件。现在应该可以编译了。

      (更改后的文件应如下所示)

      {
          "shell_cmd": "g++ -std=c++11 \"${file}\" -o \"${file_path}/${file_base_name}\"",
          "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
          "working_dir": "${file_path}",
          "selector": "source.c, source.c++",
      
          "variants":
          [
              {
                  "name": "Run",
                  "shell_cmd": "g++ -std=c++11 \"${file}\" -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""
              }
          ]
      }
      

      【讨论】:

        【解决方案5】:

        如果你想在 Sublime Text 3 中设置 C++11。在这个博客中,一切都是一步一步描述的。

        https://theangkur.blogspot.com/2020/05/set-c-11-in-sublime-text-3.html

        它对我有用。编码愉快。:)

        【讨论】:

        • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。
        猜你喜欢
        • 2014-06-29
        • 2015-12-17
        • 1970-01-01
        • 2014-08-12
        • 1970-01-01
        • 2018-04-27
        • 1970-01-01
        • 2016-03-17
        • 2019-02-12
        相关资源
        最近更新 更多