我有一个项目可以在 g++ 4.8.1 和 c++11 模式下 clang >= 3.3 下正确编译和运行。然而,当我切换到实验时-std=c++1y
模式下,clang 3.3(但不是 g++)在<cstdio>
通过 Boost.Test 间接包含的标头(所以我自己不能轻易更改它)
// /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”的成员
On 本教程 https://earthserver.com/Setting_up_a_modern_C++_development_environment_on_Linux_with_Clang_and_Emacs#Disable_max_align_t_when_clang_is_being_used%3a关于如何设置现代 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)
问题:
- 是什么导致了这个错误?没有
__clang__
宏位于相关代码附近的任何位置,并且 c++11 模式下的 clang 完全没有问题。
- 这是一个语言问题吗(关于将 C 兼容符号从全局导入到
std
命名空间)?
- 我需要更改包含路径吗? (我使用CMake自动选择标头路径,并在CMakeLists.txt中切换模式)
- clang 有开关来解决这个问题吗?
此注释在gets
联机帮助页看起来相关:
ISO C11 从 C 语言中删除了 gets() 的规范,并且从版本 2.16 开始,glibc 头文件不会公开函数声明,如果_ISOC11_SOURCE
定义了功能测试宏。
大概应该是
#if !_ISOC11_SOURCE
using ::gets;
#endif
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)