Компиляция 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 внимательно следит за стандартом и реализует перед любым другим компилятором.
Что касается вашего вопроса, вы можете скомпилировать с помощью
g++ -std=c++11
для C++11g++ -std=c++14
для C++14g++ -std=c++17
для C++17g++ -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++ см. в этом .