《AspectC++ Language Reference》Chapter 5-7

第五章 Slices

本章定义slice声明的语法和语义。下一章介绍为什么advice可以利用slice引入代码。目前,Aspect C++中只定义了类slice(class slices)

5.1 class slice声明

class slice可以在任何类域或名字空间中声明。只能定义一次,但可以有多次前向声明。如果class slice已经在某个作用域中声明过,然后又重新声明或定义的话,可以在名字前面加上修饰符,用来表明作用域,如下例所示:

slice class ASlice;

namespace N {

slice class ASlice; // 不同的slice!

}

slice class ASlice { //定义全局的slice,即::ASlice

int elem;

};

slice class N::ASlice { // 定义名字空间N中的slice,即N::ASlice

long elem;

};

如果class slice只定义基类,可以使用缩写语法:

slice class Chained : public Chain; //也就是不要大括号了。

class slice可以没有名字,但这只在作为advice声明的一部分时才有意义。class slice的声明中可以用aspect或struct关键字代替class。class slice和aspect slice之间没有区别,但是struct slice和class slice间有区别,他们中的元素引入到目标class后,对这些元素的默认访问权限不同,struct slice的是public,而class slice的是private。不允许在class slice中声明aspect、pointcut、advice和slice作为slice的成员。

class slice可以有不在slice声明体内定义的成员,例如:静态属性或非内联函数:

slice class SL {

static int answer;

void f();

};

//...

slice int SL::answer = 42;

slice void SL::f() { ... }

这些外部成员声明必须在相应slice声明之后才能出现。

第六章 Advice

本章介绍Aspect C++中不同类型的advice。advice被分为两类,一类是面向运行中程序的动态控制流中的join point的advice,例如函数调用或执行;另异类是面向静态join point的advice,例如引入class。

不管对于那种类型的advice,编译器保证包含adcice定义的aspect头文件的代码比join point处代码先编译。

6.1 动态join point的advice

before(…): advice代码的执行先于pointcut中指定的join point;

after(…):advice代码的执行后于pointcut中指定的join point;

around(…):advice代码的执行代替pointcut中指定的join point。

6.2 静态join point的advice

Aspect C++的静态join point是class或aspect。class或aspect的advice能引入新成员或引入基类。新成员或基类在目标类中的类型是private、protected还是public,这取决于aspect中advice声明的保护。

baseclass(classname) 为pointcut中的类引入新基类“classname”;

引入新成员是通过slice

只有在目标上下文环境中才能对引入声明从语意上进行分析。因此,声明可能会引用一些东西,比如说类型或常量,这些类型或常量只有在目标类中才有意义,在aspect定义中不存在。如果需要引入构造函数或析构函数,那么aspect的名字就要和构造或析构函数名字一样。

非内联的introduction可用于引入静态属性、以及声明和定义分开的成员函数。引入的成员的名字需要加上表示它属于哪个aspect的限定。

第七章 JoinPoint API

本章介绍JoinPoint的API。

7.1 类型

类型

说明

Result

函数的返回值类型;

That

对象类型(对象是初始化call的对象);

Target

目标对象类型(call的目标对象)

初始化call的对象:这样翻译不知对不对,例如:obj.call(),那么初始化call的对象就是obj。

call的目标对象:这个可以参见前面,tjp->target()->m_Instance。

7.2 函数

表 静态函数

函数

说明

static AC::Type type()

返回join point的类型码,类型码依照C++ ABI V3标准;

static int args()

返回call的参数个数,并执行join point;

static AC::Type argtype(int number)

返回第number个形参的类型码,类型码依照C++ ABI V3标准;

static const char *signature()

返回对join point的描述,描述是文本形式的;

static unsigned int id()

返回join point的数字id号,这个id号是唯一的;

static AT::Type resulttype()

返回结果类型,类型码依照C++ ABI V3标准;

static AC::JPType jptype()

返回描述join point 类型的标识,这个标识是唯一的。

表 非静态函数

函数

说明

void *arg(int number)

返回指针,这个指针指向的是存放第number个参数的内存空间;

Result *result()

返回指向函数返回值的指针,如果函数没有返回值,那么返回0;

That *that()

返回指针,指针指向的是初始化call的对象;如果call的是静态函数或全局函数,没有初始化call的对象,那么返回0;

Target *target()

返回指针,指针指向call的目标,如果call的是静态函数或全局函数,那么返回0;

void proceed()

在around()的advice中实现对join point代码的执行,他是通过调用action().trigger()实现的;

AC::Action &action()

返回运行时的action对象,action对象包含执行环境,这个执行环境用来执行被around advice封装的原始功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值