Как найти поддерживаемый по умолчанию стандарт C ++ компилятором g ++ в cmake - PullRequest
0 голосов
/ 22 февраля 2019

Я видел много потоков о том, как включить определенный стандарт C ++, например

add_definitions("-std=c++14")

и

set (CMAKE_CXX_STANDARD 11)

Но как найти, какой стандарт по умолчанию компилятор g ++ следует при компиляции кода?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Если вы разрабатываете приложение , вам не следует корректировать код в соответствии с доступной версией компилятора, вместо этого вы должны указать, для какого стандарта компилятора ваш код требует :

set (CMAKE_CXX_STANDARD 11)

Если вы создаете библиотеку кода , предназначенную для использования в различных контекстах, используйте компилятор обнаружение функции и условную компиляцию.Например:

write_compiler_detection_header(
  FILE "${CMAKE_CURRENT_BINARY_DIR}/compiler_features.h"
  PREFIX Foo
  COMPILERS GNU
  FEATURES
    cxx_variadic_templates
)

А затем:

#include "compiler_features.h"
#if Foo_COMPILER_CXX_VARIADIC_TEMPLATES
#  include "with_variadics/interface.h"
#else
#  include "no_variadics/interface.h"
#endif

Это особенно полезно для компиляторов, таких как MSVC, которые имеют много функций из C ++ 17, но при этом не имеют некоторых основных функций из C ++11 (например, выражение SFINAE).

CMake имеет встроенные детекторы для многих популярных функций C ++.


PS.Если вам действительно интересно, G ++ до 5.0 использует по умолчанию gnu++98 стандарт и 6.0 gnu++14 (GNU-диалект -std = c ++ 14).

0 голосов
/ 22 февраля 2019

add_definitions("-std=c++14") - неправильный способ включения C ++ 14.Правильный путь или второй, который вы упомянули: set(CMAKE_CXX_STANDARD 14), или set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14").

add_definitions для определений макросов, эквивалентных #define в вашем исходном коде.

По вашему вопросу, это плохая практика - зависеть от версии C ++ по умолчанию в вашем компиляторе.Даже Visual Studio теперь определяет стандарт, который вы хотите использовать, что является новой вещью в VS.Стандарты созданы для решения этой проблемы , указав их .Итак, в вашем проекте вы определяете целевой стандарт и определяете его в файле make.Не следует ожидать, что ваш код будет работать по всем стандартам C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...