ACE全局宏定义
VERSIONED_NAMESPACE是新版本定义的,我们可以看作替换的时候为空
服务工厂宏定义1
# define ACE_SVC_FACTORY_DEFINE(X) ACE_FACTORY_DEFINE(ACE_Svc, X)
我们看到了ACE_SVC_FACTORY_DEFINE就是讲上面定义的CLS定义成ACE_Svc,本质是一样的。不同地方是DLL倒出前缀不一样,是ACE_Svc_Export不是ACE_Local_Service_Export_Export
服务工厂宏定义2
# define ACE_FACTORY_DEFINE(CLS,SERVICE_CLASS) /
void ACE_MAKE_SVC_CONFIG_GOBBLER_NAME(ACE_VERSIONED_NAMESPACE_NAME,SERVICE_CLASS) (void *p) { /
ACE_VERSIONED_NAMESPACE_NAME::ACE_Service_Object * _p = /
static_cast< ACE_VERSIONED_NAMESPACE_NAME::ACE_Service_Object *> (p); /
ACE_ASSERT (_p != 0); /
delete _p; } /
extern "C" CLS##_Export ACE_VERSIONED_NAMESPACE_NAME::ACE_Service_Object */
ACE_MAKE_SVC_CONFIG_FACTORY_NAME(ACE_VERSIONED_NAMESPACE_NAME,SERVICE_CLASS) (ACE_Service_Object_Exterminator *gobbler) /
{ /
ACE_TRACE (#SERVICE_CLASS); /
if (gobbler != 0) /
*gobbler = (ACE_Service_Object_Exterminator) ACE_MAKE_SVC_CONFIG_GOBBLER_NAME(ACE_VERSIONED_NAMESPACE_NAME,SERVICE_CLASS); /
return new SERVICE_CLASS; /
}
#define ACE_MAKE_SVC_CONFIG_GOBBLER_NAME(VERSIONED_NAMESPACE,SERVICE_CLASS) 转定义为ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(_gobble,VERSIONED_NAMESPACE,SERVICE_CLASS)
# define ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(PREFIX,VERSIONED_NAMESPACE,SERVICE_CLASS) PREFIX ## _ ## SERVICE_CLASS
转换成实际的代码:就是SERVICE_CLASS前加了_gobble_
_gobble_SERVICE_CLASS
#define ACE_MAKE_SVC_CONFIG_FACTORY_NAME(VERSIONED_NAMESPACE,SERVICE_CLASS) 转定义ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(_make,VERSIONED_NAMESPACE,SERVICE_CLASS)
# define ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(PREFIX,VERSIONED_NAMESPACE,SERVICE_CLASS) PREFIX ## _ ## SERVICE_CLASS
转换成实际的代码:就是SERVICE_CLASS前加了_make_
_make_SERVICE_CLASS
#define ACE_MAKE_SVC_CONFIG_GOBBLER_NAME(VERSIONED_NAMESPACE,SERVICE_CLASS) ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(_gobble,VERSIONED_NAMESPACE,SERVICE_CLASS)
# define ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(PREFIX,VERSIONED_NAMESPACE,SERVICE_CLASS) PREFIX ## _ ## SERVICE_CLASS
转换成实际的代码
_gobble_SERVICE_CLASS
这句话展开如下:
ACE_FACTORY_DEFINE (ACE_Local_Service, myclass)
整个宏如下???替换成对应的类名myclass:
Class myclass
{
……
};
void _gobble_myclass (void*p)
{
ACE_Service_Object * _p = static_cast< ACE_Service_Object *> (p);
ACE_ASSERT (_p != 0);
delete _p;
}
// 这里需要注意一下,DLL倒出的前缀CLS
extern "C" CLS_Export ACE_Service_Object *
_make_myclass (ACE_Service_Object_Exterminator *gobbler)
{
ACE_TRACE (myclass);
if (gobbler != 0)
*gobbler = (ACE_Service_Object_Exterminator) _gobble_myclass);
return new myclass;
}
_make_myclass创建(new)一个实例,并传出一个实例删除函数_gobble_myclass
静态服务定义
ACE_STATIC_SVC_DEFINE (
myclass, // 描述类的名,一般就是类名
ACE_TEXT ("myclass"), // 这个可以自己定义
ACE_SVC_OBJ_T,
&ACE_SVC_NAME (myclass),
ACE_Service_Type::DELETE_THIS
| ACE_Service_Type::DELETE_OBJ,
0 // This object is not initially active.
);
#define ACE_STATIC_SVC_DEFINE(SERVICE_CLASS, NAME, TYPE, FN, FLAGS, ACTIVE) /
ACE_Static_Svc_Descriptor ace_svc_desc_##SERVICE_CLASS = { NAME, TYPE, FN, FLAGS, ACTIVE };
看服务名定义
# define ACE_SVC_NAME(SERVICE_CLASS) ACE_MAKE_SVC_CONFIG_FACTORY_NAME(ACE_VERSIONED_NAMESPACE_NAME,SERVICE_CLASS)
#define ACE_MAKE_SVC_CONFIG_FACTORY_NAME(VERSIONED_NAMESPACE,SERVICE_CLASS) ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(_make,VERSIONED_NAMESPACE,SERVICE_CLASS)
# define ACE_MAKE_SVC_CONFIG_FUNCTION_NAME(PREFIX,VERSIONED_NAMESPACE,SERVICE_CLASS) PREFIX ## _ ## SERVICE_CLASS
转换成实际的代码:
_make_SERVICE_CLASS
实际如下:是初始化一个静态结构的成员
ACE_Static_Svc_Descriptor ace_svc_desc_myclass
{
"myclass", // 服务描述串
ACE_SVC_OBJ_T,
&_make_myclass, // 这是就是上面的_make_myclass创建(new)一个实例函数指针
ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
0
}
// 静态对象定义
ACE_STATIC_SVC_REQUIRE (myclass)
# define ACE_STATIC_SVC_REQUIRE(SERVICE_CLASS)/
class ACE_Static_Svc_##SERVICE_CLASS {/
public:/
ACE_Static_Svc_##SERVICE_CLASS() { /
ACE_Service_Config::static_svcs ()->insert (/
&ace_svc_desc_##SERVICE_CLASS); /
} /
};/
static ACE_Static_Svc_##SERVICE_CLASS ace_static_svc_##SERVICE_CLASS;
实际的代码:
class ACE_Static_Svc_??? {
public:
ACE_Static_Svc_???() {
ACE_Service_Config::static_svcs ()->insert (
&ace_svc_desc_???);
}
};
static ACE_Static_Svc_??? ace_static_svc_???;
??? 替换成实际的类名
整个在一起实际宏代码如下:
ACE_FACTORY_DEFINE (ACE_Local_Service, myclass)
ACE_STATIC_SVC_DEFINE (
myclass, // 描述类的名,一般就是类名
ACE_TEXT ("myclass"), // 这个可以自己定义
ACE_SVC_OBJ_T,
&ACE_SVC_NAME (myclass),
ACE_Service_Type::DELETE_THIS
| ACE_Service_Type::DELETE_OBJ,
0 // This object is not initially active.
);
ACE_STATIC_SVC_REQUIRE (myclass)
宏展开替换如下
// 服务类定义
Class myclass
{
……
};
// 删除服务实例的函数
void _gobble_myclass (void*p)
{
ACE_Service_Object * _p = static_cast< ACE_Service_Object *> (p);
ACE_ASSERT (_p != 0);
delete _p;
}
// 创建服务实例的函数
extern "C" ACE_Local_Service_Export_Export ACE_Service_Object *
_make_myclass (ACE_Service_Object_Exterminator *gobbler)
{
ACE_TRACE (myclass);
if (gobbler != 0)
*gobbler = (ACE_Service_Object_Exterminator) _gobble_myclass);
return new myclass;
}
// 服务实例描述
ACE_Static_Svc_Descriptor ace_svc_desc_myclass
{
"myclass", // 服务描述的名称
ACE_SVC_OBJ_T,
&_make_myclass, // 这是就是上面的创建实例函数指针
ACE_Service_Type::DELETE_THIS | ACE_Service_Type::DELETE_OBJ,
0
}
// 静态服务类定义
class ACE_Static_Svc_myclass {
public:
ACE_Static_Svc_ myclass () {
ACE_Service_Config::static_svcs ()->insert (
&ace_svc_desc_myclass);
}
};
// 静态实例定义
static ACE_Static_Svc_myclass ace_static_svc_myclass;
6626

被折叠的 条评论
为什么被折叠?



