Sublime Text 3中的C11和c++ 11问题

C11 and C++11 problems in Sublime Text 3

本文关键字:c++ 问题 C11 Text 中的 Sublime      更新时间:2023-10-16

我将Sublime Text 3升级为C/c++版本,但我必须在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: %sn", i, argv[i]);
    }
    getchar();
    return 0;
}

Sublime给出错误:

C:UserspcDesktopCPPprojectc99.c:7:2: error: 'for' loop initial declarations are only allowed in C99 or C11 mode
  for( int i = 0; argv[i]; i++ ) {
  ^
C:UserspcDesktopCPPprojectc99.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:UserspcDesktopCPPprojectmain.cpp: In function 'int main(int, char**)':
C:UserspcDesktopCPPprojectmain.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:UserspcDesktopCPPprojectmain.cpp:17:45: error: could not convert '{"one", "two", "three"}' from '<brace-enclosed initializer list>' to 'std::vector<std::basic_string<char> >'
C:UserspcDesktopCPPprojectmain.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中的输出??

谢谢的! !

如注释中所述,您需要更改的是构建系统。在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-package s的位置可能类似于C:Program FilesSublime Text 3Packages.

一旦进入这个文件夹,你应该看到一堆.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"并选择弹出的选项。

有时当您这样做时,您可能会遇到错误,例如语法错误,或者其他类型的错误,以避免使用标准c++配置,只需在shell_cmd中的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",
            "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选项。

关于如何处理这类文件的更多信息,请参阅关于构建系统的崇高文档

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}'"]
        }
    ]
}

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}""
        }
    ]
}