重新加载内联 ostringstream 宏

Posted

技术标签:

【中文标题】重新加载内联 ostringstream 宏【英文标题】:Inline ostringstream macro reloaded 【发布时间】:2009-01-29 16:56:14 【问题描述】:

参考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 )
);

使用 GCC 效果很好。它也在 Visual C++ 2005 下编译和运行。但是对于后者,宏的所有使用都会导致空字符串,而我对于为什么以及如何解决它......?

【问题讨论】:

【参考方案1】:

很遗憾,我无法使用 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;

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

【讨论】:

seekp() 是罪魁祸首。不确定 MSVC++ 对此有何不同,但将 ostringstream().seekp( 0, ios_base::cur ) 替换为 ostringstream()

以上是关于重新加载内联 ostringstream 宏的主要内容,如果未能解决你的问题,请参考以下文章

内联更新后,Kendo Treelist重新加载/刷新

内联函数和宏比较

用内联取代宏代码

深入探讨 内联函数和宏定义的区别

宏函数普通函数内联函数的区别

内联函数和宏定义的区别和联系