Подтвердить что ты не робот

Как я могу использовать возможности С++ 14 при создании проектов qmake?

В настоящее время я использую возможности С++ 11 в своих приложениях Qt. Тем не менее, я хотел бы использовать некоторые из новых возможностей С++ 14 в своих приложениях.

Чтобы включить С++ 11 в приложении Qt, нужно только добавить одну строку в файл проекта qmake, а именно:

CONFIG += c++11

или это для более ранних версий:

QMAKE_CXXFLAGS += -std=c++1y

Я уже пытался сделать то же самое с С++ 14, но это не сработало. Я изменил вышеупомянутую строку проекта qmake следующим образом:

CONFIG += c++14

или это для более ранних версий:

QMAKE_CXXFLAGS += -std=c++1y

После этого при попытке создания проекта появляется много ошибок компиляции, которые раньше не существовали. Однако проект компилируется, если я пытаюсь использовать любые возможности С++ 14, я получаю ошибку компиляции. Это пример:

template<typename T>
constexpr T pi = T(3.1415926535897932385);

Это соответствующая ошибка:

main.cpp:7: error: template declaration of 'constexpr const T pi'
constexpr T pi = T(3.1415926535897932385);  
          ^

Как включить возможности С++ 14 при использовании проекта qmake в QtCreator?

Я использую Qt 5.3.2, Qt Creator 3.2.1 и MinGW 4.8.2 32 бит.

4b9b3361

Ответ 1

Qt Creator - это IDE.

Вы можете думать о IDE как "умных текстовых редакторах", которые помогают разработчику отлаживать, строить, завершать код, управлять файлами и т.д.

В процессе компиляции IDE неактуальны.

Важно, что ваш компилятор. И он не зависит от вашей среды разработки.

g++ 4.8.x не поддерживает многие возможности С++ 14: ознакомьтесь с этой страницей, чтобы узнать, что С++ 14 функции поддерживаются.

Ответ 2

Теперь это поддерживается с Qt 5.4. Вы просто вводите это в свой файл проекта qmake:

CONFIG += c++14

Необходимое изменение кода произошло в середине 2014 года Thiago:

Добавить поддержку для CONFIG + = С++ 14

Я только что создал необходимое изменение документации:

Упоминайте параметр С++ 14 CONFIG в ссылке на переменную qmake

Обратите внимание, что переменные шаблоны поддерживаются только gcc 5.0, но ваш код работает очень хорошо. Это можно использовать для тестирования С++ 14 со старым gcc:

main.cpp

#include <iostream>

int main()
{
    // Binary literals: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3472.pdf
    // Single-quotation-mark as a digit separator: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3781.pdf
    std::cout << 0b0001'0000'0001;
    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
CONFIG -= qt
CONFIG += c++14
SOURCES += main.cpp

Сборка и запуск

qmake && make && ./main

Выход

257

Ответ 3

Чтобы использовать С++ 14 с qmake с версиями до Qt 5.4 (это не имеет никакого значения, вы используете его с Qt Creator или с какой-либо другой IDE или из командной строки) и gcc, добавьте это в свой .pro файл:

QMAKE_CXXFLAGS += -std=c++1y

qmake получил поддержку CONFIG += c++14 с Qt 5.4, поэтому вы можете использовать это для проектов, где вам удобно с требованием, по крайней мере, той версии Qt. Обязательно используйте явные флаги компилятора или используйте параметр CONFIG, но не оба одновременно, чтобы избежать конфликтующих переключателей.


К сожалению, gcc 4.8.2 поддерживает очень мало возможностей С++ 14 (см. здесь), но вы можете проверить это с помощью этого фрагмента кода:

#include <iostream>

auto f() { return 42; }

int main()
{
    std::cout << f() << std::endl;
}

Это будет компилироваться с помощью QMAKE_CXXFLAGS += -std=c++1y, но дать предупреждение с помощью CONFIG += c++11 или QMAKE_CXXFLAGS += -std=c++1x.

Ответ 4

По какой-то странной причине это то, что делает Qt: Если компилятор gcc или mingw, CONFIG+=C++14 преобразуется в флаг компилятора -std=c++14 (что вы ожидаете)

Если другой компилятор (например, clang), CONFIG=C++14 глупо преобразуется в -std=c++11 (sic!), вы получите ошибки о неподдерживаемых функциях, даже если ваша версия clang корректно поддерживает С++ 14.

Чтобы исправить это, укажите флаг явно:

QMAKE_CXXFLAGS += -std=c++14

Таким образом, вы уверены, что ваш компилятор (g++, mingw или clang) получит правильные флаги.