【发布时间】:2010-11-27 19:34:57
【问题描述】:
升级到 Xcode 3.2 和 Snow Leopard 后,我的调试版本在运行时损坏并失败。字符串流似乎不起作用。它们在发布模式下工作。
我已将其范围缩小为 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 时,'
我尝试了编译器和 SDK 的各种组合,结果如下: - 在 SDK 10.6 中使用 GCC 4.2、LLVM-GCC 或 CLANG 不起作用。 - 在 SDK 10.5 中使用 GCC 4.2、LLVM-GCC 或 CLANG 确实有效。 - 将 GCC 4.0 与 SDK 10.5 或 10.6 一起使用。
如果 _GLIBCXX_DEBUG 已损坏或不受支持(使用 SDK 10.6 和 GCC 4.2),那么为什么这是新项目中调试配置的默认设置(C++ 命令行)?
【问题讨论】: