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

8

我升级了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中看到输出?

谢谢!!!


2
Sublime Text本身没有编译器或语法检查器,必须安装一个模块。请检查该模块的配置文件。 - Some programmer dude
5
@JoachimPileborg的说法有误。这个问题可以不用安装任何东西就能轻松解决。Sublime Text确实有构建系统(即可在文件或项目上运行的命令)。Luchnik只需要配置一下即可。 - Rapptz
以下是有关ST3构建系统的文档。为C和C++分别创建一个新的构建系统,并包含适当的“-std”标志。 - Praetorian
4个回答

7

正如评论中所述,需要您修改构建系统。在 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的位置可能类似于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”。 - shiin
我在想第一个命令行数组的最后一项("${file}")是否有错别字。 - SwiftsNamesake
@SwiftsNamesake 是的,看起来是引号放错了位置。已经修复。 - Alec
@Alec:最后一行缺少一个双引号。修复后它完美地工作了! - sookie
1
@sookie 谢谢!已修复。 - Alec

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

0
Alec的解决方案对我很有效,但是名为“Run”的运行变体无法使用C++11构建,因此我添加了一个名为“使用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}'"]
        }
    ]
}

0
有时候当你这样做时,可能会遇到错误,比如语法错误或其他一些错误。为了避免这些问题,请使用标准的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选项的配置相同。

如果想要了解如何处理这些文件,请查看sublime构建系统的相关文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接