我有一个项目在c ++ 11模式下正确编译并运行在g ++ 4.8.1和clang> = 3.3下。但是,当我切换到实验-std=c++1y
模式时,通过Boost.Test间接包含的<cstdio>
标题上的clang 3.3(但不是g ++)扼流圈(所以我自己不能轻易改变它)
// /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 /../../../../包括/ C ++ / 4.8 / cstdio:119:11: 错误:全局命名空间中没有名为“gets”的成员
在关于如何设置现代C ++环境的this tutorial上,遇到了与max_align_t
类似的查找问题。建议使用sed脚本用#ifdef __clang__
宏包围未知符号,但这似乎是一种脆弱的方法。
设置:普通的64位Linux Mint 15
g ++(Ubuntu 4.8.1-2ubuntu1~13.04)4.8.1
Ubuntu clang version 3.3-3~raring1(branches / release_33)(基于 LLVM 3.3)
问题:
__clang__
宏,并且c ++ 11模式中的clang完全没有问题。 std
命名空间)? 答案 0 :(得分:23)
gets
联机帮助页中的这条说明看起来很相似:
ISO C11从C语言中删除了gets()的规范,从版本2.16开始,如果定义了
_ISOC11_SOURCE
特征测试宏,glibc头文件不会公开函数声明。
可能应该是
#if !_ISOC11_SOURCE
using ::gets;
#endif