C++中的Clang> = 3.3 1y模式无法解析<cstdio>标头

Tem*_*Rex 42 c++ header clang c++11 c++14

我有一个项目正确编译并在g ++ 4.8.1下运行,并在c ++ 11模式下运行> = 3.3.但是,当我切换到实验-std=c++1y模式时,<cstdio>通过Boost.Test间接包含的标题中的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
// ...
}
Run Code Online (Sandbox Code Playgroud)

带有以下错误消息:

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/cstdio:119:11:错误:全球没有名为'gets'的成员命名空间

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

安装程序:普通的64位Linux Mint 15

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

Ubuntu clang版本3.3-3~raring1(branches/release_33)(基于LLVM 3.3)

问题:

  • 是什么导致这个erorr?__clang__在所讨论的代码附近没有任何宏,并且c ++ 11模式中的clang完全没有问题.
  • 这是一个语言问题(C++ 14是否会说C++ 11关于将C兼容符号从全局导入std命名空间)?
  • 我是否需要使用包含路径更改内容?(我使用CMake自动选择标题路径,并在CMakeLists.txt中切换模式)
  • clang有切换来解决这个问题吗?

Ben*_*igt 23

gets联机帮助页中的此注释看起来很相关:

ISO C11从C语言中删除了gets()的规范,从版本2.16开始,如果_ISOC11_SOURCE定义了功能测试宏,glibc头文件不会公开函数声明.

可能应该是

#if !_ISOC11_SOURCE
using ::gets;
#endif
Run Code Online (Sandbox Code Playgroud)

  • 是的,你检查过`stdio.h`了吗?2.17有`#if!defined __USE_ISOC11 || (定义__cplusplus && __cplusplus <= 201103L)`. (3认同)
  • 有关历史,请参阅http://sourceware.org/bugzilla/show_bug.cgi?id=13566和http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51785 (2认同)
  • @JonathanWakely感谢您的链接.因此,两个可接受的解决方案是glibc和libstdc ++都有一个``ifdef`围绕`gets`,或者它们都无条件地声明它.是否有机会将4.9修复程序向后移植到4.8? (2认同)