Компиляция C++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.

6 ответов

Решение

Флаги (или параметры компилятора) - это не что иное, как обычные аргументы командной строки, передаваемые в исполняемый файл компилятора.

Предполагая, что вы вызываете g++ из командной строки (терминала):

$ g++ -std=c++11 your_file.cpp -o your_program

или же

$ g++ -std=c++0x your_file.cpp -o your_program

если вышеупомянутое не работает.

Вы можете проверить свои 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

Вы можете обратиться к следующей ссылке, для которой функции поддерживаются в конкретной версии компилятора. Он имеет исчерпывающий список поддержки функций в компиляторе. Похоже, GCC внимательно следит за стандартом и реализует перед любым другим компилятором.

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

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

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

Ваша Ubuntu определенно имеет достаточно свежую версию g++. Используемый флаг -std=c++0x,

Если вы хотите сохранить расширения компилятора GNU, используйте -std=gnu++0x вместо -std = C++0x. Вот цитата из справочной страницы:

Компилятор может принимать несколько базовых стандартов, таких как c89 или C++98, и GNU-диалекты этих стандартов, таких как gnu89 или gnu++98. Указывая базовый стандарт, компилятор будет принимать все программы, соответствующие этому стандарту, и программы, использующие расширения GNU, которые не противоречат ему. Например, -std=c89 отключает некоторые функции GCC, которые несовместимы с ISO C90, такие как ключевые слова "asm" и "typeof", но не другие расширения GNU, которые не имеют значения в ISO C90, такие как пропуск средний термин выражения "?:". С другой стороны, при указании GNU-диалекта стандарта все функции, поддерживаемые компилятором, включаются, даже когда эти функции меняют значение базового стандарта и некоторые программы, строго соответствующие стандартам, могут быть отклонены. Конкретный стандарт используется -pedantic для определения того, какие функции являются расширениями GNU для данной версии стандарта. Например, -std=gnu89 -pedantic будет предупреждать о // комментариях в стиле C++, а -std=gnu99 -pedantic - нет.

Использовать -std=c++11флаг компилятора для ISO C++11.
Дополнительные сведения о флагах и параметрах компилятора C++ см. в этом .

Другие вопросы по тегам