__cplusplus & lt; 201402L возвращает true в gcc, даже когда я указал -std = c ++ 14

Директива:

#ifndef __cplusplus
#error C++ is required
#elif __cplusplus < 201402L
#error C++14 is required
#endif

Командная строка: g++ -Wall -Wextra -std=c++14 -c -o header.o header.hpp

Моя версия g ++: g++ (tdm-1) 4.9.2

Ошибка C++14 is required генерируется даже когда я добавил -std=c++14Я не знаю почему.

Подскажите пожалуйста как это исправить.

2

Решение

Согласно руководству GCC CPP (версия 4.9.2 а также 5.1.0):

__cplusplus Этот макрос определяется, когда используется компилятор C ++. Ты можешь использовать __cplusplus проверить, скомпилирован ли заголовок компилятором C или C ++. Этот макрос похож на __STDC_VERSION__в том, что расширяется до номера версии. В зависимости от выбранного языкового стандарта значение макроса 199711Lв соответствии со стандартом C ++ 1998 года; 201103Lсогласно стандарту C ++ 2011 года; неопределенное значение, строго превышающее 201103L для экспериментальных языков, включенных -std=c++1y а также -std=gnu++1y,

Вы можете проверить это g++ --std=c++14 определяет __cplusplus как:

 Version    __cplusplus
4.8.3       201300L
4.9.2       201300L
5.1.0       201402L

За clang++ --std=c++14:

 Version    __cplusplus
3.3          201305L
3.4          201305L
3.5.x        201402L
3.6          201402L
3.7          201402L

Поэтому более надежной проверкой, вероятно, должно быть:

#ifndef __cplusplus
#  error C++ is required
#elif __cplusplus <= 201103L
#  error C++14 is required
#endif

Как указано в комментарии, это может означать частичную поддержку C ++ 14.

Для проверки конкретной функции вы также можете попробовать Boost Config (особенно Макросы, описывающие функции C ++ 14, не поддерживаются).

10

Другие решения


По вопросам рекламы [email protected]