2014-01-11 81 views
3

跟進到我這個問題的答案: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++標準中是必需的,允許還是定義的?在cplusplus.com上,我可以發現iostream將包括ostreamios,但是沒有關於進一步關閉的信息。

+0

有一些包括標準的要求,但除此之外,每個標準頭允許包含任何想要的標頭 – PlasmaHH

+0

C++ 11§17.6.5.2標頭[res.on.headers]/1: 「 C++頭文件可能包含其他C++頭文件......「 – Casey

回答

1

C++標準要求在某些地方需要包含另一個頭(例如,<iostream>必須包括<istream><ostream>)。否則,該標準允許包含標題並提供可用的聲明,這些聲明不需要從特定標題變爲可用。

我認爲這將是有用的,使正確的聲明可用的那些聲明是必需的,但我不知道可用。這些標題可能沒有實際的定義,只能用於驗證是否包含所有必要的標題。將頭文件作爲實際實現的一部分可能會更好,但這會使聲明更加複雜。