全球服务注册和逗号运营商

时间:2014-02-02 14:43:15

标签: c++ global-variables registration void comma-operator

有一个注册服务的全局函数:

// services call this to register upon creation
extern void RegisterService(adapter::Service *s);

然后在.cpp文件中的某个地方,某些服务会自行注册:

// create the adapter and register with libecap to reach the host application
static const bool Registered = (libecap::RegisterService(new Adapter::Service), true);

为什么不通过调用libecap :: RegisterService(new Adapter :: Service)来进行注册? 它看起来更奇怪,因为未使用全局变量 已注册

2 个答案:

答案 0 :(得分:3)

代码的aithor想要一个bool标志来说明服务是否已经注册。他可以写例如

libecap::RegisterService(new Adapter::Service);
static const bool Registered =  true;

前提是Registered是一个局部变量。

但是如果Registered不是局部变量,那么他可能不会在某个其他函数(或主函数)之外调用函数。因此,定义全局bool变量(具有外部或内部链接)并同时调用具有返回类型void的函数的唯一方法是以下

static const bool Registered = (libecap::RegisterService(new Adapter::Service), true);

逗号运算符的表达式结果为true,注册将由此值初始化。同时函数libecap :: RegisterService(new Adapter :: Service)将被调用。

作为替代方案,他可以定义一个类,其构造函数将包含函数的调用,而析构函数将包含一些取消注册的东西。

答案 1 :(得分:3)

因为您无法将表达式放在源文件中浮动的空白区域中。只有声明

这是强制在此处计算表达式的常用方法,即使之后实际上从未使用过该对象。