Компіляція C ++ 11 з g ++


367

Я намагаюся оновити свій компілятор 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.


5
У найновішій версії вам, мабуть, доведеться використовувати -std=c++11замість цього. Можливо, і те й інше дозволено.

6
Це пропускає багато контексту. Покажіть повну команду, яку ви пробували (можливо, навіть зразок коду, який ви намагалися скласти), і що насправді не вдалося.
KillianDS

4
@classdaknok_t: обидва повинні бути дозволені, також ubuntu 12.04 кораблі g++-4.6за замовчуванням (який підтримує лише -std=c++0x)
KillianDS

3
Додати прапори відразу після g++, наприклад g++ -std=c++0x _filename_ && ./a.out.
н. 'займенники' м.

1
Підійшов до цієї публікації, шукаючи заголовкове повідомлення про помилку. Я працюю над проектом QMAKE, рішенням для мене було додавання CONFIG + = c ++ 11 у файл .pro.

Відповіді:


529

Прапори (або параметри компілятора) - це не що інше, як звичайні аргументи командного рядка, передані виконуваному компілятору.

Якщо припустити, що ви викликаєте g ++ з командного рядка (терміналу):

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

або

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

якщо вищезгадане не працює.


8
Не забудьте поставити -Wall -gодразу після цьогоg++
Базиле Старинкевич,

7
@BasileStarynkevitch: Я б додав -Werrorтеж, без причин, щоб не почати проект.
Матьє М.

3
Краща підтримка C ++ 11 є дискусійною, і в даний час краща діагностика не виглядає набагато кращою (на сторінці Кланга , що описує їх, використовується GCC 4.2, що є давнім) gcc.gnu.org/wiki/ClangDiagnosticsComppare ;)
Джонатан Уейклі,

58
Хтось знає, чи / коли компілятори C ++ підтримуватимуть стандарт C ++ 11 за замовчуванням, тобто без прапора?
Денніс

2
А якщо ви ще не знаєте, у Visual C ++ просто використовуйте VC11 (Visual Studio 2012) або вище, щоб мати функції C ++ 11
gerrytan

44

Ви можете перевірити свою 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 ++ самостійно і заміни компілятора системи для довідки
Colin D

13

Ваш ubuntu, безумовно, має досить недавню версію g ++. Прапор для використання є -std=c++0x.


Як ви можете це сказати, він використовує ubuntu ?. Просто цікаво знати.
Шраван40

22
@ Shravan40 OP прямо говорить I'm using Ubuntu 12.04.у запитанні.
Тимофій Гу

10

Якщо ви хочете зберегти розширення компілятора 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 не буде.


І що це ви отримуєте, окрім бінарного ?:оператора? Єдине інше розширення, яке спадає на думку, структурні вирази, витісняється ініціалізацією списку C ++ 11. У будь-якому випадку ця цитата в основному стосується C, а не C ++.
Potatoswatter

9

Ви можете посилатися на наступне посилання, для якого підтримуються особливості конкретної версії компілятора. У ньому є вичерпний список підтримки функцій у компіляторі. Виглядає, що 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.

Список змінюється досить швидко, слідкуйте за списком, якщо ви чекаєте, чи буде підтримана певна функція.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.