Компиляция С++ 11 с g++
Я пытаюсь обновить компилятор C++ до C++ 11. Я немного искал, и я пришел к выводу, что мне нужно использовать флаг -std=C++0x
или -std=gnu++0x
, но я не знаю много о флажках. Может кто-нибудь мне помочь? (Я использую Ubuntu 12.04.)
Вот ошибка, которую я получаю от компилятора, когда пытаюсь использовать библиотеку, которая включена в C++ 11 (т.е. массив):
#include <array>
#include <iostream>
int main()
{
std::array<int, 3> arr = {2, 3, 5};
...
}
Этот файл требует поддержки компилятора и библиотеки для предстоящего стандарта ISO C++, C++ 0x. Эта поддержка в настоящее время является экспериментальной и должна быть включена с параметрами компилятора -std = C++ 0x или -std = gnu ++ 0x.
Ответы
Ответ 1
Флаги (или параметры компилятора) - это не что иное, как обычные аргументы командной строки, переданные в исполняемый файл компилятора.
Предполагая, что вы вызываете g++ из командной строки (терминала):
$ g++ -std=c++11 your_file.cpp -o your_program
или
$ g++ -std=c++0x your_file.cpp -o your_program
если вышеуказанное не работает.
Ответ 2
Вы можете проверить свой g++
по команде:
which g++
g++ --version
это скажет вам, какой компилятор сейчас указывает.
Чтобы переключиться на g++
4.7 (при условии, что вы установили его на свой компьютер), запустите:
sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/gcc-4.6 60 auto mode
1 /usr/bin/gcc-4.6 60 manual mode
* 2 /usr/bin/gcc-4.7 40 manual mode
Затем выберите 2
как выбор (Моя машина уже указывает на g++
4.7, поэтому *)
Как только вы переключите комплимент, снова запустите g++ --version
, чтобы проверить правильность переключения.
Теперь скомпилируйте свою программу с помощью
g++ -std=c++11 your_file.cpp -o main
Ответ 3
У вашего ubuntu определенно есть достаточно последняя версия g++. Используемый флаг -std=c++0x
.
Ответ 4
Если вы хотите сохранить расширения компилятора GNU, используйте -std = gnu ++ 0x, а не -std = С++ 0x. Вот цитата из справочной страницы:
Компилятор может принимать несколько базовых стандартов, таких как c89 или С++ 98, и GNU-диалекты этих стандартов, такие как gnu89 или gnu ++ 98. От указав базовый стандарт, компилятор примет все программы следуя этому стандарту, и тех, кто использует расширения GNU, которые не противоречат ему. Например, -std = c89 отключает некоторые функции GCC которые несовместимы с ISO C90, такими как "asm" и "typeof", ключевые слова, но не другие расширения GNU, которые не имеют значения в ISO C90, например, исключая средний термин выражения "?:". На с другой стороны, указав диалоги GNU стандарта, все функции поддержка компилятора включена, даже если эти функции меняют значение базового стандарта и некоторые строго соответствующие программы могут быть отвергнутым. Конкретный стандарт используется для определения которые являются расширениями GNU, учитывая ту версию стандарта. Например, std = gnu89 -pedantic будет предупреждать о стиле С++// комментариев, тогда как -std = gnu99 -pedantic не будет.
Ответ 5
Вы можете обратиться к следующей ссылке, для которой поддерживаются функции в конкретной версии компилятора. Он содержит исчерпывающий список поддержки функций в компиляторе. Looks GCC внимательно следит и реализует перед любым другим компилятором.
Что касается вашего вопроса, вы можете скомпилировать
-
g++ -std=c++11
для С++ 11 -
g++ -std=c++14
для С++ 14 -
g++ -std=c++17
для С++ 17 -
g++ -std=c++2a
для С++ 20, хотя все возможности С++ 20 еще не поддерживаются, ссылайтесь на эту ссылку для списка поддержки функций в GCC.
Список меняется довольно быстро, следите за списком, если вы ожидаете поддержки определенной функции.