2014-05-02 42 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}\"" 
     } 
    ] 
}