gpt4 book ai didi

c++ - 标准库头层次结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:35 25 4
gpt4 key购买 nike

跟进我对这个问题的回答:SIGSEGV on declaration

在这个问题中,提问者遇到了一些简单代码的段错误问题。事实证明,它甚至没有为我和其他人编译。 GCC (4.8.1) 由于重新声明名称为 bsearch 的变量而出错,该名称恰好与 std 中的函数名称相同。这导致了冲突,因为代码还使用了 using namespace std;。由于提问者接受了我的回答,我猜这与运行时错误有某种关系(虽然很奇怪)。

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

事实证明,gcc 包含 cstdlib,如果 iostream 无论如何都包含在跟踪中:

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++ 标准中是否要求、允许或定义了这种 include 结构?在 cplusplus.com 上,我可以找到 iostream 将包含 ostreamios,但没有关于 includes 进一步的信息。

最佳答案

C++ 标准在某些地方要求必须包含另一个 header (例如,<iostream> 必须包含 <istream><ostream>)。否则,该标准允许包含 header 并提供不需要从特定 header 中获取的声明。

我认为拥有一个 header 系统会很有用,它可以准确地提供那些需要提供的声明,但我不知道它是可用的。这些 header 可能没有实际定义,仅用于验证是否包含所有必要的 header 。将 header 作为实际实现的一部分可能会更好,但这会使声明变得相当复杂。

关于c++ - 标准库头层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21067114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com