标准库头文件层次结构

4

针对这个问题,我的回答是: SIGSEGV on declaration

在这个问题中,提问者遇到了一些简单代码的分段错误问题。但实际上,它甚至不能编译通过,其他人也有同样的问题。GCC(4.8.1)由于变量名bsearchstd中的函数名相同而导致错误。由于代码还使用了using namespace std;,因此出现了冲突。由于提问者接受了我的答案,我猜测这与运行时错误有关(尽管很奇怪)。

然而,提问者表示代码在codeblocks上可以编译通过,其他人也证实了这一点。应该在cstdlib中定义bsearch,但代码没有包含它。

事实证明,如果无论如何都包含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模式下才能这样做。

在c++标准中,这种包含结构是必需的、允许的还是根本没有定义?在cplusplus.com上我可以找到iostream会包含ostream和ios的信息,但是关于更深层次的包含却没有任何信息。


标准要求包含一些头文件,但除此之外,每个标准头文件都可以包含任何它想要的头文件。 - PlasmaHH
C++11 §17.6.5.2 头文件 [res.on.headers]/1: "C++头文件可以包含其他C++头文件..." - Casey
1个回答

2
C++标准在某些情况下规定必须包含另一个头文件(例如,<iostream> 必须包含 <istream><ostream>)。否则,标准允许包含头文件并使声明可用,而这些声明不需要从特定的头文件中获得。
我认为有一个头文件系统可以使那些必须提供的声明正好可用,但我不知道是否已经有了这样的系统。这些头文件可以没有实际定义,只用于验证是否已经包含了所有必要的头文件。最好将这些头文件作为实际实现的一部分,但这将使声明变得更加复杂。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接