2014-05-02 12 views
7

mogę zaktualizować Sublime Text 3 dla C/C++, ale muszę napisać kod w nowoczesnych wersjach takich jak C11 i C++ 11.C11 i C++ 11 problemy w Sublime Text 3

Kiedy próbuję kod C11 takiego:

#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 daje błędy:

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 

można wyjaśnić mi jak używać -std = c99, -std = gnu99, -std = opcje c11 lub -std = gnu11?

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

samo z C++ 11. Oto kod:

#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; 
} 

i lista błędów:

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 
       ^

mi pomóc rozwiązać te problemy, proszę!

I jeszcze jedno pytanie: Kiedy uruchomię kod - plik .exe pojawia się w tym samym folderze z kodem źródłowym i muszę go otworzyć. Czy są jakieś możliwości, aby zobaczyć wyjście w Sublime Text po kliknięciu "ctrl + b" ???

Dziękuję !!!

+2

Sublime Text nie posiada kompilator lub sprawdzania składni sama, to musi być w module, który został zainstalowany. Sprawdź plik konfiguracyjny dla tego modułu. –

+5

@JoachimPileborg Mylące. Jest to problem, który można łatwo naprawić bez instalowania czegokolwiek. Sublime Text ma systemy kompilacji (tzn. Polecenia do uruchomienia na pliku lub projekcie). Luchnik po prostu musi je skonfigurować. – Rapptz

+0

[Tutaj jest dokumentacja] (http://docs.sublimetext.info/en/latest/reference/build_systems.html) na systemach kompilacji ST3. Stwórz sobie nowe dla każdego C i C++, które zawierają odpowiednią flagę '-std'. – Praetorian

Odpowiedz

6

Jak stwierdzono w komentarzach, to twój system budowy, który musisz zmienić. I ST3 nieco trudniej jest modyfikować domyślne pakiety. Są wtyczki do tego, ale jeszcze ich nie używam. Oto bezpłatny sposób wtyczki.

Po pierwsze, trzeba będzie nowy .sublime-build. Myślę, że to powinno zadziałać.

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

Następnie należy przejść do miejsca, w którym przechowywane są pakiety domyślne dla ST3. Wygląda na to, że używasz systemu Windows. Lokalizacja .sublime-package s jest prawdopodobnie podobna do C: \ Program Files \ Sublime Text 3 \ Packages.

Znajdując się w tym folderze, powinieneś zobaczyć pliki .sublime-package z nazwami wszystkich języków, które zostały wbudowane w obsługę. Wybierz numer C++.sublime-package i zrób jego kopię do innego katalogu. Następnie zmień nazwę na C++.zip i wyodrębnij ją. Usuń plik C++.sublime-build i zastąp go plikiem o tej samej nazwie, który zawiera powyższy kod. Ponownie rozpakuj plik i zmień jego nazwę na C++.sublime-package i umieść go z powrotem w folderze, z którego został pobrany.

Teraz:

  • Po naciśnięciu Ctrl + B, ST3 automatycznie budować z flagą C++ 11 dla gcc.
  • Jeśli chcesz uruchomić program (myślę, że to, co masz na myśli przez „widzieć wyjście wewnątrz Sublime Text”) Ctrl + Shift + B po program został skompilowany.
  • Jeśli chcesz budować przy użyciu gcc ale bez flag C++ 11, naciśnij ctrl + shift + p i wpisz "Kompilacja: kompilacja bez C++ 11" i wybierz opcję, która się wyskakuje.
+0

Nie trzeba modyfikować pliku ".sublime-package". Zamiast tego możesz umieścić nowy plik "C++. Sublime-build" w folderze pakietu użytkownika w podfolderze zwanym również "C++". W moim przypadku plik znajduje się w tej pozycji ".... \ SublimeText \ Data \ Packages \ User \ C++ \ C++. Sublime-build". – shiin

+0

Zastanawiam się, czy w ostatnim elemencie pierwszej tablicy wiersza poleceń występuje literówka ('" $ {plik} ""). – SwiftsNamesake

+0

@SwiftsNamesake Tak, wygląda na niewłaściwie umieszczony cudzysłów Naprawiono – Alec

0

Czasami, gdy to zrobisz, możesz napotkać błąd, np. Błąd składniowy lub inny rodzaj błędu, aby uniknąć wszystkich, które używają standardowej konfiguracji C++, po prostu dodaj słowo kluczowe -std = C++ 11 po g ++ w shell_cmd przykładu

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

to robi. C++ 98 to ta sama konfiguracja bez opcji -std = c + 11.

uzyskać więcej informacji na temat sposobów radzenia sobie z tego rodzaju pliku proszę udać się do rozwiązania sublime documentation about build systems

0

Aleca to działa dobrze dla mnie, ale wariant run zwany „Run” nie będzie budować z C++ 11, więc dodałem jeszcze jedną opcję Uruchom, o nazwie „Uruchom z 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

Sublime Text 3 sprawia, że ​​trudniej zmodyfikować ustawienia domyślne; aby je zmienić, możesz użyć pakietu "PackageResourceViewer". Zainstaluj ten pakiet (PackageControl jest zalecane), a następnie naciśnij Ctrl + Shift + P i wykonaj polecenia:

PackageResourceViewer: OpenResource -> C++ -> C++ Pojedyncze File.sublime-zbudować

Dodaj opcję „-std = C++ 11 "po każdym znalezionym poleceniu" g ++ ". Zapisz i zamknij plik. Powinieneś być teraz w stanie skompilować.

(Plik powinien wyglądać jak poniżej po zmianach)

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