内联ostringstream宏重新加载

时间:2009-01-29 16:56:15

标签: c++ visual-c++ macros ostringstream

参考C++ format macro / inline ostringstream

有一个宏的问题是允许对象的内联连接来创建一个字符串,iostream风格。

答案是:

#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
        ( std::ostringstream().seekp( 0, std::ios_base::cur ) << x ) \
    ).str()

用法(例如):

throw std::runtime_error(
        SSTR( "FooBar error: Value " << x << " exceeds " << y )
);

这非常有效 - 与海湾合作委员会合作。它也在Visual C ++ 2005下编译和运行。但是对于后者,宏的所有用途都会导致空字符串,我对于为什么以及如何修复它感到非常傻眼......?

1 个答案:

答案 0 :(得分:2)

不幸的是,我无法访问MSVC编译器进行测试。

在我过去使用微软工具的经验中,似乎微软将语言定义和标准视为粗略指南。 (我在项目上浪费了很多时间,只是为了发现微软打破了C99基本的传统。)

鉴于这种令人遗憾的情况,我建议你尝试一系列琐碎的程序。比如:

std::ostringstream() o;
o.seekp( 0, std::ios_base::cur ) << "foo";
cout << "Test1:  " << o << endl;

或者也许:

std::ostringstream() o;
cout << "Test2:  " << typeid(o).name() << endl;
cout << "Test3:  " << typeid(o.seekp( 0, std::ios_base::cur )).name() << endl;

试着看看事情在什么时候停止工作。然后从那里解决问题。

相关问题