针对这个问题,我的回答是: SIGSEGV on declaration
在这个问题中,提问者遇到了一些简单代码的分段错误问题。但实际上,它甚至不能编译通过,其他人也有同样的问题。GCC(4.8.1)由于变量名bsearch与std
中的函数名相同而导致错误。由于代码还使用了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的信息,但是关于更深层次的包含却没有任何信息。