Ответ 1
Clang имеет (как и любой другой компилятор С++) некоторые языковые расширения (есть список расширений С++ 11, которые доступны в С++ 03). Одним из этих расширений является диапазон, основанный на цикле. Вы можете проверить его на #if __has_extension(cxx_range_for) ...
. В любом случае он будет генерировать предупреждение (если вы не отключите его с помощью -Wno-c++11-extensions
). Вы можете проверить функции с помощью:
#if __has_extension(cxx_range_for)
#warning __has_extension(cxx_range_for) is true
#else
#warning __has_extension(cxx_range_for) is false
#endif
#if __has_feature(cxx_range_for)
#warning __has_feature(cxx_range_for) is true
#else
#warning __has_feature(cxx_range_for) is false
#endif
#if __has_extension(cxx_auto_type)
#warning __has_extension(cxx_auto_type) is true
#else
#warning __has_extension(cxx_auto_type) is false
#endif
#if __has_feature(cxx_auto_type)
#warning __has_feature(cxx_auto_type) is true
#else
#warning __has_feature(cxx_auto_type) is false
#endif
int main()
{
return 0;
}
Любопытно, что это предупреждает, что расширение и функция вывода типа неактивны, но он достоверно компилирует автоматический указатель (я думаю, что это из-за старого значения auto
как спецификатор класса хранения):
main.cpp:2:2: warning: __has_extension(cxx_range_for) is true [-W#warnings]
#warning __has_extension(cxx_range_for) is true
^
main.cpp:10:2: warning: __has_feature(cxx_range_for) is false [-W#warnings]
#warning __has_feature(cxx_range_for) is false
^
main.cpp:16:2: warning: __has_extension(cxx_auto_type) is false [-W#warnings]
#warning __has_extension(cxx_auto_type) is false
^
main.cpp:22:2: warning: __has_feature(cxx_auto_type) is false [-W#warnings]
#warning __has_feature(cxx_auto_type) is false
^
Чтобы полностью соответствовать стандарту, вы должны рассматривать предупреждения как ошибки, включив -Werror
.