Компиляция С++ 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 внимательно следит и реализует перед любым другим компилятором.

Что касается вашего вопроса, вы можете скомпилировать

  1. g++ -std=c++11 для С++ 11
  2. g++ -std=c++14 для С++ 14
  3. g++ -std=c++17 для С++ 17
  4. g++ -std=c++2a для С++ 20, хотя все возможности С++ 20 еще не поддерживаются, ссылайтесь на эту ссылку для списка поддержки функций в GCC.

Список меняется довольно быстро, следите за списком, если вы ожидаете поддержки определенной функции.