У меня есть проект, который правильно компилируется и запускается под 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 переключатель для решения этой проблемы?