标准库标头层次结构
Standard library header hierarchy
跟进我对这个问题的回答:声明上的SIGSEGV
在这个问题中,提问者遇到了一些简单代码的分段错误问题。事实证明,它甚至没有为我和其他人编译。GCC(4.8.1)由于名称为bsearch
的变量的重新声明而出现错误,该变量恰好与std
中的函数名称相同。这导致了冲突,因为代码也使用了using namespace std;
。既然提问者接受了我的回答,我想这在某种程度上与运行时错误有关(尽管很奇怪)。
然而,提问者表示,该代码在代码块上会编译得很好,其他人也证实了这一点。bsearch
应该在cstdlib
中定义,但代码中没有包含它
事实证明,如果无论如何都包括iostream
,那么gcc包括cstdlib
,正如从跟踪中可以看到的那样:
g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -Wall -Wextra -pedantic -MMD -MP -MF"src/Test.d" -MT"src/Test.d" -o "src/Test.o" "../src/Test.cpp"
../src/Test.cpp:14:27: error: ‘long long int bsearch’ redeclared as different kind of symbol
long long int bsiter,bsearch;
^
In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/cstdlib:72:0,
from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/ext/string_conversions.h:41,
from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/bits/basic_string.h:2815,
from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/string:52,
from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/bits/locale_classes.h:40,
src/subdir.mk:18: recipe for target 'src/Test.o' failed
from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/bits/ios_base.h:41,
from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/ios:42,
from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/ostream:38,
from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/iostream:39,
from ../src/Test.cpp:1:
/usr/include/stdlib.h:754:14: error: previous declaration of ‘void* bsearch(const void*, const void*, size_t, size_t, __compar_fn_t)’
extern void *bsearch (const void *__key, const void *__base,
^
make: *** [src/Test.o] Error 1
它只在c++0x和c++11模式下这样做。
这个includes的结构在c++标准中是必需的、允许的还是定义的?在cplusplus.com上,我可以发现iostream
将包括ostream
和ios
,但没有关于进一步包括的信息。
C++标准在某些地方要求必须包括另一个标头(例如,<iostream>
必须包括<istream>
和<ostream>
)。否则,该标准允许包含标头,并使声明可用,而这些声明不需要从特定标头变为可用。
我认为有一个标头系统会很有用,它可以准确地提供那些需要提供的声明,但我不知道这是可用的。这些标头可能没有实际定义,仅用于验证是否包含所有必要的标头。将头作为实际实现的一部分可能会更好,但这会使声明变得更加复杂。
相关文章:
- 如何重构类层次结构以避免菱形问题
- C++ 中模板化类型的类层次结构
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 继承层次结构并将元素添加到向量
- C++ 类层次结构中的"对齐"是什么意思?
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 类层次结构中的运算符重载
- 如何在层次结构中实现运算符使用?
- 反向层次结构中的可变参数模板参数
- 如何在继承层次结构中调用具有默认参数的构造函数?
- C++ 提升 - 包含类层次结构对象的类的序列化
- 在C++继承层次结构时提取实现者
- 在C++中将类实例添加到对象层次结构中的问题
- 确定大层次结构中基本指针的实际类型,无需dynamic_cast
- 在继承层次结构中复制和移动
- 模板冲突的类型-但类型应该是相同的cfr类层次结构
- 删除父/子窗口层次结构的最佳方法
- 是否可以使一个类成为两个不同层次结构的子类?
- 标准库标头层次结构
- 标准异常层次结构结构的原因