2014-05-02 41 views
7

我升级了C/C++的Sublime Text 3,但是我必须在C11和C++ 11等现代版本中编写代码。崇高文本中的C11和C++ 11问题3

当我尝试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; 
} 

崇高给出了一个错误:

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

崇高的文本本身不具有编译器或语法检查器,它必须是你已经安装了一个模块中。检查该模块的配置文件。 –

+5

@JoachimPileborg误导人。这是一个可以在不安装任何东西的情况下轻松解决的问题。 Sublime Text确实具有构建系统(即在文件或项目上运行的命令)。 Luchnik只需要配置它们。在ST3构建系统上的 – Rapptz

+0

[这里是文档](http://docs.sublimetext.info/en/latest/reference/build_systems.html)。为每个包含适当的“-std”标志的C和C++创建一个新的。 – Praetorian

回答

6

正如评论中所述,这是您需要修改的构建系统。我在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 Files \ Sublime Text 3 \ Packages。

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

现在:

  • 当你按Ctrl + B,ST3会自动建立一个使用C++ 11标志GCC。
  • 如果你想运行你的程序(我认为这就是你的意思是“看到Sublime Text里面的输出”),程序编译完成后按ctrl + shift + b。
  • 如果你想使用gcc编译,但是使用而不使用 C++ 11标志,请按ctrl + shift + p并输入“Build:Build without C++ 11”,然后选择弹出的选项。
+0

您不必修改'.sublime-package'文件。相反,您可以将新的'C++。sublime-build'文件放在您的用户包文件夹中的一个子文件夹中,也称为'C++'。在我的情况下,文件在这个位置'.... \ SublimeText \ Data \ Packages \ User \ C++ \ C++。sublime-build'。 – shiin

+0

我想知道在第一个命令行数组的最后一项中是否有一个输入错误('“$ {file}”“')。 – SwiftsNamesake

+0

@SwiftsNamesake是的,看起来像一个错位的引号mark1。固定。 – Alec

0

有时,当你这样做时,你可能会遇到一个错误,说一个语法错误或其他类型的错误,以避免所有使用标准C++配置的错误,只需添加关键字-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

0

亚历克的解决方案工作很适合我,但所谓的“运行”的运行变种不会与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

崇高的文本3使得难以修改默认设置;要改变它们,你可以使用包“PackageResourceViewer”。安装该软件包(PackageControl建议),然后按CTRL + SHIFT + P,并执行命令:

PackageResourceViewer:OpenResource - > C++ - > C++单File.sublime-建立

添加选项“-std在你找到的每一个“g ++”命令后面都输入“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}\"" 
     } 
    ] 
}