После обновления до Xcode 3.2 и Snow Leopard мои отладочные сборки ломаются и дают сбой во время выполнения. Струнные потоки, похоже, не работают. Они работают в режиме Release.
Я сузил его до комбинации 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;
}
Вставка потока строк должна работать, но при использовании GCC 4.2 и _GLIBCXX_DEBUG оператор «<<» выдает исключение, и биты сбоя и сбоя устанавливаются. </p>
Я пробовал различные комбинации компилятора и SDK с этими результатами:
- Использование GCC 4.2, LLVM-GCC или CLANG с SDK 10.6 НЕ работает.
- Использование GCC 4.2, LLVM-GCC или CLANG с SDK 10.5 работает.
- Использование GCC 4.0 с SDK 10.5 или 10.6 работает.
Если _GLIBCXX_DEBUG не работает или не поддерживается (с SDK 10.6 и GCC 4.2), то почему это по умолчанию для конфигураций отладки в новых проектах (командная строка C ++)?