__cplusplus ‹ 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, не знаю почему.

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


person DMaster    schedule 23.06.2015    source источник
comment
Некоторые компиляторы рассматривали бы -std=c++14 как запрос на включение любых реализованных функций C++14, в то время как 201402L подразумевало бы полную поддержку этого стандарта, так что это не обязательно просто ошибка/ошибка с GCC. Прочтите документы GCC, если хотите понять, что он делает....   -  person Tony Delroy    schedule 23.06.2015


Ответы (1)


Согласно руководству 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 функций не поддерживаются).

person manlio    schedule 23.06.2015
comment
Устанавливается ли макрос __cplusplus, когда расширение файла .cpp или когда программа компилируется с помощью компилятора. Потому что, когда я написал простую программу, используя приведенную выше информацию, и скомпилировал программу, используя gcc, а не g++, компилятор прервал компиляцию, но на основе #elif, и если я не напишу условие #elif и скомпилирую программу, используя gcc, она не не прерывать по условию #ifndef __cplusplus Можете пояснить, что на самом деле происходит? Ссылка на код: pastebin.com/iiuzPrwW - person strikersps; 21.04.2020
comment
@strikersps Макрос препроцессора __cplusplus определяется, если модуль компиляции скомпилирован с помощью компилятора C++. Технически gcc или g++ можно использовать для общей разработки на C++ с соответствующими настройками параметров. Однако поведение g++ по умолчанию естественным образом соответствует разработке на C++. Дополнительные сведения см. на странице stackoverflow.com/q/172587/3235496. - person manlio; 21.04.2020