Подтвердить что ты не робот

Clang >= 3.3 в режиме С++ 1y не может разобрать заголовок <cstdio>

У меня есть проект, который правильно компилируется и запускается под g++ 4.8.1 и clang >= 3.3 в режиме С++ 11. Однако, когда я переключаюсь в экспериментальный режим -std=c++1y, clang 3.3 (но не g++) дросселирует заголовок <cstdio>, который косвенно включается с помощью Boost.Test(поэтому я не могу легко изменить его сам)

// /usr/include/c++/4.8/cstdio
#include <stdio.h>

// Get rid of those macros defined in <stdio.h> in lieu of real functions.
// ...
#undef gets
// ...    

namespace std
{
// ...
using ::gets; // <-- error with clang++ -std=c++1y
// ...
}

со следующим сообщением об ошибке:

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../включают в себя/С++/4.8/cstdio: 119: 11: error: ни один член с именем 'gets' в глобальном пространстве имен

В этом учебнике о том, как настроить современную среду С++, возникает аналогичная проблема поиска с max_align_t. Рекомендация заключается в использовании sed script для окружения неизвестных символов макросами #ifdef __clang__, но это кажется хрупким подходом.

Настройка: простой 64-разрядный Linux Mint 15 с

g++ (Ubuntu 4.8.1-2ubuntu1 ~ 13.04) 4.8.1

Ubuntu clang version 3.3-3 ~ raring1 (branch/release_33) (на основе LLVM 3.3)

Вопросы:

  • Что вызывает этот erorr? Нет макроса __clang__ в любом месте рядом с данным кодом, и clang в режиме С++ 11 вообще не имеет проблем.
  • Является ли это проблемой языка (говорит ли С++ 14 что-то еще, кроме С++ 11 о том, как импортировать C-совместимые символы из глобального в пространство имен std)?
  • Нужно ли мне что-то менять с помощью моих включенных путей? (Я использую CMake для автоматического выбора путей заголовка и режимов переключения внутри CMakeLists.txt)
  • Есть ли у clang переключатель для решения этой проблемы?
4b9b3361

Ответ 1

Эта заметка в справочной странице gets выглядит актуальной:

ISO C11 удаляет спецификацию gets() с языка C, а начиная с версии 2.16, файлы заголовков glibc не выставляют объявление функции, если определен макрос теста _ISOC11_SOURCE.

Вероятно, должно быть

#if !_ISOC11_SOURCE
using ::gets;
#endif