C ++ 1y模式下的Clang&gt; = 3.3无法解析<cstdio> header </cstdio>

时间:2013-07-21 18:17:00

标签: c++ c++11 header clang c++14

我有一个项目在c ++ 11模式下正确编译并运行在g ++ 4.8.1和clang&gt; = 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完全没有问题。
  • 这是一个语言问题吗(C ++ 14是否会说C ++ 11关于将C兼容符号从全局导入std命名空间)?
  • 我是否需要使用包含路径更改内容? (我使用CMake自动选择标题路径,并在CMakeLists.txt内切换模式)
  • clang是否有开关来解决这个问题?

1 个答案:

答案 0 :(得分:23)

gets联机帮助页中的这条说明看起来很相似:

  

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

可能应该是

#if !_ISOC11_SOURCE
using ::gets;
#endif