在C ++ 1y模式中,Clang> = 3.3不能parsing<cstdio>头文件

我有一个项目,正确地编译和运行在g ++ 4.8.1和铿锵> = 3.3在c + + 11模式。 但是,当我切换到实验-std=c++1y模式时,在通过Boost.Test间接包含的<cstdio>头文件中的clang 3.3(但不是g ++)扼stream圈(所以我不能轻易地自己改变它)

 // /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/../../../../include/c++/4.8/cstdio:119:11:错误:在全局中没有名为“gets”的成员命名空间

在本教程中 ,如何设置一个现代的C ++环境,遇到了一个max_align_t类似的查找问题。 build议使用sed脚本用#ifdef __clang__macros包围未知符号,但这似乎是一个脆弱的方法。

安装程序:纯64位Linux Mint 15与

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

Ubuntu的铿锵声版本3.3-3〜raring1(branches / release_33)(基于LLVM 3.3)

问题

  • 什么导致这个错误? 在所__clang__的代码附近没有任何__clang__macros,并且在c ++ 11模式下的clang完全没有问题。
  • 这是一个语言问题(C ++ 14是否说C ++ 11有关将全局C兼容符号导入std名称空间的内容)?
  • 我需要改变我的包含path吗? (我使用CMake自动select头文件path,并在CMakeLists.txt中切换模式)
  • 铿锵有一个开关来解决这个问题?

gets联机帮助页中的这个注释看上去相关:

ISO C11从C语言中删除了gets()的规范,自版本2.16开始,如果定义了_ISOC11_SOURCE特性testingmacros,则glibc头文件不会公开函数声明。

可能应该是

 #if !_ISOC11_SOURCE using ::gets; #endif