Вопрос по c++11, c++ – Компиляция C ++ 11 с g ++

316

Я пытаюсь обновить мой компилятор 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};
    ...
}

This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.

Добавьте флаги сразу послеg++например,g++ -std=c++0x _filename_ && ./a.out. n.m.
Наткнулся на это сообщение, ища озаглавленное сообщение об ошибке. Я работаю над проектом QMAKE, решением для меня было добавление CONFIG + = c ++ 11 в файл .pro. user1800885
В последней версии вы, вероятно, должны использовать-std=c++11 вместо. Может быть, и то и другое разрешено. user1203803
@classdaknok_t: должно быть разрешено и то и другое, а также Ubuntu 12.04g++-4.6 по умолчанию (который поддерживает только-std=c++0x) KillianDS
Это пропускает много контекста. Покажите полную команду, которую вы пробовали (возможно, даже пример кода, который вы пытались скомпилировать), и что на самом деле не удалось. KillianDS

Ваш Ответ

5   ответов
41

Вы можете проверить свои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
Стоит упомянуть, что такие версии, как g ++ 4.4, могут быть слишком старыми, чтобы выполнять некоторые функции, поэтому необходимо обновление. Обновление будет зависеть от вашей системы, и я буду избегать методов компиляции g ++ самостоятельно и замены системного компилятора для справки.
462

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

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

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

или же

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

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

Не забудьте поставить-Wall -g сразу послеg++
@BasileStarynkevitch: я бы добавил-Werror тоже нет причин не при запуске проекта.
Кто-нибудь знает, если / когда компиляторы C ++ будут поддерживать стандарт C ++ 11 по умолчанию, то есть без флага?
А в случае, если вы этого еще не знаете, в Visual C ++ просто используйте VC11 (Visual Studio 2012) или выше, чтобы иметь функции C ++ 11
Лучшая поддержка C ++ 11 является дискуссионной, а лучшая диагностика в наши дни выглядит не так уж и лучше (на странице Clang, описывающей их, используется GCC 4.2, который является древним)gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
10

используйте -std = gnu ++ 0x вместо -std = c ++ 0x. Вот цитата из справочной страницы:

The compiler can accept several base standards, such as c89 or c++98, and GNU dialects of those standards, such as gnu89 or gnu++98. By specifying a base standard, the compiler will accept all programs following that standard and those using GNU extensions that do not contradict it. For example, -std=c89 turns off certain features of GCC that are incompatible with ISO C90, such as the "asm" and "typeof" keywords, but not other GNU extensions that do not have a meaning in ISO C90, such as omitting the middle term of a "?:" expression. On the other hand, by specifying a GNU dialect of a standard, all features the compiler support are enabled, even when those features change the meaning of the base standard and some strict-conforming programs may be rejected. The particular standard is used by -pedantic to identify which features are GNU extensions given that version of the standard. For example-std=gnu89 -pedantic would warn about C++ style // comments, while -std=gnu99 -pedantic would not.

И что это дает вам, кроме двоичного?: оператор? Единственное другое расширение, которое приходит на ум, структурные выражения, заменяется инициализацией списка C ++ 11. В любом случае, эта цитата в основном относится к C, а не к C ++.
2

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

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

g++ -std=c++11 for C++11 g++ -std=c++14 for C++14 g++ -std=c++17 for C++17 g++ -std=c++2a for C++20, although all features of C++20 are not yet supported refer this link for feature support list in GCC.

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

12

мый флаг-std=c++0x.

@ Shravan40 OP явно говоритI'm using Ubuntu 12.04. в вопросе.
Как вы можете сказать, что он использует Ubuntu? Просто интересно узнать.

Похожие вопросы