我有一个包含链式函数调用的大型应用程序,如下所示:
subsystem.
do_stuff(cfg().get("x")).
do_stuff(cfg().get("y"));
此处subsystem
是类类型的对象:
struct Sybsystem
{
Sybsystem& do_stuff(int parameter)
{
... // much code
return *this; // this line makes it possible to chain calls
}
};
此外,cfg()
是一个"全局函数"返回一个配置对象:
struct Configuration
{
int get(const char* param_name);
}
Configuration& cfg();
带链接函数调用的代码首先执行x
,然后执行y
;但是,C ++没有定义何时从配置对象中提取x
和y
的配置参数。实际上,当我在调试和发布模式(MS Visual Studio 2005)中运行我的应用程序时,调用Configuration::get
的顺序是相反的。
一切顺利,直到我们添加了对从Configuration::get
返回随机值的支持(用于测试)。当我们这样做时,调试和发布模式中的行为变得不同。
所以我的问题是:
我可以修复此问题并仍使用链式函数调用吗? (我们用这种方式编写了很多代码;改变它们会很烦人)
我可以使用volatile
?
答案 0 :(得分:3)
您必须打破链条以创建自己的序列点,此顺序非常重要。