我是一名Java开发人员,我对C宏的语法不是很熟悉.我正在研究Deitel&Deitel的书,但它没有帮助.
我无法理解这个宏的含义:
#define _GetFrontItem(d,q) ( (d)->itemCache + ( (q)*(d)->block_size + \
(d)->offset[q] % (d)->block_size )*(d)->itemSize)
Run Code Online (Sandbox Code Playgroud)
d是指向结构的指针,q是一个size_t.
宏在此文件中使用.
你能帮我理解一下吗?这个宏完成了什么?为什么写它的方式?有没有更清晰的方法来编写这个宏?
我不得不说,那是一个该死的丑陋宏.继续.
宏所做的是计算结构的"项目缓存"(无论是什么)的索引,并返回指向它的指针:(d->itemCache + something)相当于&d->itemCache[something].
因此宏相当于以下内联函数(这里标识符来自google匹配):
static inline char *_GetFrontItem(Data *d, size_t q) {
return &d->itemCache[
d->itemSize * (q * d->block_size + d->offset[q] % d->block_size)
];
}
Run Code Online (Sandbox Code Playgroud)
......这更容易理解.为什么它首先是一个宏可能是因为这是遗留代码,从过去的内联函数根本就不存在.
每当您_GetFrontItem(d,q)在源代码中编写 代码时,它将被预处理器替换为该行
(d)->itemCache + ( (q)*(d)->block_size + (d)->offset[q] % (d)->block_size )*(d)->itemSize
Run Code Online (Sandbox Code Playgroud)
所以这里d必须通过注意来成为结构的指针->。Morever通过指向的结构d必须有至少3名成员如下 itemCache,block_size并称为阵列offset数据类型的
该宏除了替换计算之外什么都不做。
第一行中的另一件事:
#define _GetFrontItem(d,q) ( (d)->itemCache + ( (q)*(d)->block_size + \
注意\行尾的反斜杠。在定义宏时(在该行的末尾)使用该字符时,将使您继续在第二行上书写,就像在第一行继续一样。它可以被认为是使代码可读且不复杂的工具!