Xcode 3.2とSnow Leopardにアップグレードした後、デバッグビルドが壊れて実行時に失敗します。ストリングストリームは機能していないようです。彼らはリリースモードで動作します。Snow Leopard XcodeでC++デバッグビルドが壊れた
私は、GCC 4.2、OSX SDK 10.6、_GLIBCXX_DEBUGプリプロセッサ記号の組み合わせに絞っています。これらは新しいXcodeプロジェクトのデバッグ設定のデフォルトです。
このコードは、問題を示しています。
#include <iostream>
#include <string>
#include <sstream>
int main (int argc, char * const argv[]) {
std::stringstream stream;
std::cout << " expected actual" << std::endl;
std::cout << "stream.bad: 0 " << stream.bad() << std::endl;
std::cout << "stream.fail: 0 " << stream.fail() << std::endl;
std::cout << "stream.eof: 0 " << stream.eof() << std::endl;
std::cout << "stream.good: 1 " << stream.good() << std::endl;
stream.exceptions(std::ios::badbit | std::ios::failbit | std::ios::eofbit);
try{
stream << 11; //< Does not work as expected (see output)
}catch (std::bad_cast &e) {
std::cout << "Unexpected bad_cast: " << e.what() << std::endl;
}catch(std::exception &e){
std::cout << "Unexpected exception: " << e.what() << std::endl;
}
std::cout << " expected actual" << std::endl;
std::cout << "stream.bad: 0 " << stream.bad() << std::endl;
std::cout << "stream.fail: 0 " << stream.fail() << std::endl;
std::cout << "stream.eof: 0 " << stream.eof() << std::endl;
std::cout << "stream.good: 1 " << stream.good() << std::endl;
std::cout << std::endl;
std::cout << "EXPECT: " << 11 << std::endl;
std::cout << "ACTUAL: " << stream.str() << std::endl;
std::cout << std::endl << "Done" << std::endl;
return 0;
}
にstringstream挿入が動作するはずが、しかし、GCC 4.2と_GLIBCXX_DEBUGを使用する場合、「< <」演算子は例外をスローし、不良とフェイルビットが設定されています。
コンパイラとSDKのさまざまな組み合わせを試しました。 - GCC 4.2、LLVM-GCC、またはCLANGをSDK 10.6で使用すると動作しません。 - GCC 4.2、LLVM-GCC、またはSDK 10.5のCLANGを使用すると機能します。 - GCC 4.0をSDK 10.5または10.6で使用すると動作します。
_GLIBCXX_DEBUGが壊れているかサポートされていない場合(SDK 10.6およびGCC 4.2)、なぜ新しいプロジェクト(C++コマンドライン)のデバッグ設定のデフォルトですか?
、GCCは、オープンソースであるため、いつでも修正することができますがあなた自身。 – Crashworks
ありがとう、 AppleのGCC専用ですか?このバージョンの他のプラットフォームでも動作します。 サポートされていない場合は、XCodeのデフォルトはなぜですか? Appleはどこに文書化していますか? – crmoore
@cdespinosa、STLデバッグモードがサポートされていないと言ったソースがありますか?また、私はOSX Lionでこれを試しましたが、それでも動作しません。 – highBandWidth