在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