2017-01-25 19 views
0

Мое приложение может использоваться в системах, которые по-прежнему не соответствуют Qt4.x, а не Qt5.x, и я пытался сделать «быстрый и грязный» порт версии, которая будет компилировать/связывать и запускаться либо с основной версией библиотек. Мне было интересно, что будет лучшим способом, чтобы обойти отсутствие Q_NULLPTR в Qt4.x? Я увидел ссылку, указанную в this SO ответ, который указывает на определение, как:Замена для Q_NULLPTR при обращении приложения Qt5 к Qt4?

#ifdef Q_COMPILER_NULLPTR 
# define Q_NULLPTR   nullptr 
#else 
# define Q_NULLPTR   NULL 
#endif 

Так я должен просто использовать:

contains(QT_MAJOR_VERSION, 4) { 
DEFINES += Q_NULLPTR=NULL 
} 

в моем файле qmake проекта?

+0

Зачем использовать 'Q_NULLPTR' вообще, а не' nullptr' в вашем приложении? Неважно, какую версию Qt вы используете, если используете компилятор C++ 11. – sharyex

+0

Я, возможно, перефразирую его, чтобы сказать «Приложение FOSS, в которое я вношу свой вклад» - мы начали использовать Q_NULLPTR, когда мы перешли на Qt 5.xa пару лет назад - я пытался найти способ вернуться к тому, чтобы быть Qt4 .x и сделать как можно меньше изменений; и я не уверен, что люди, использующие Qt4.x, будут использовать компилятор C++ 11 (например, они могут быть на 'gcc' 4.7 not 4.9) ... – SlySven

ответ

0

Q_NULLPTR - способ Qt поддерживать как компиляторы C++ 11, так и старые C++ 98/03. Вам действительно нужен этот уровень сложности? Если нет, то просто используйте NULL, 0 или nullptr напрямую, в зависимости от вашего компилятора.

В противном случае все усложняется, потому что вам необходимо определить текущую активную версию на C++. См. Править ниже.

Конечно, вы всегда можете выбрать простой способ и использовать NULL или 0, который работает во всех версиях C++.

Редактировать

Чтобы имитировать поведение Qt5 в вы могли бы использовать это:

#if __cplusplus >= 201103L 
    #define Q_NULLPTR nullptr 
#else 
    // not NULL to stay consistent with Qt’s convention 
    #define Q_NULLPTR 0 
#endif 

В том числе заголовок просто иметь доступ к Q_NULLPTR не очень большой, так что вы, вероятно, хотите, чтобы определить этот макрос в файле .pro. Однако я не знаю, как определить активную версию C++ с QMake Qt4.

+0

Однако Q_NULLPTR __is не присутствует в _Qt4.x ___, поэтому мой вопрос - Я думаю, что в прошлом мы использовали жесткий '0', но я не был уверен, что это лучший выбор ...! – SlySven

+0

Не имеет значения, что Qt4 не предоставляет 'Q_NULLPTR'. Это обычный макрос. Нет причин не определять его самостоятельно, когда вы создаете свой собственный код против сборки Qt4, если вам нужна гибкость, которую он предоставляет. – besc

+0

Да, но __what__ - лучшая вещь, чтобы определить это в этом случае - вот что я думал, что я спрашивал! 8-) Я надеялся, что Qt все еще может определить Q_COMPILER_NULLPTR даже в Qt 4, но я думаю, мне придется взглянуть и посмотреть ... – SlySven