用指针理解C宏

Вит*_*вич 4 c macros pointers

我是一名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.

宏在此文件中使用.

你能帮我理解一下吗?这个宏完成了什么?为什么写它的方式?有没有更清晰的方法来编写这个宏?

Que*_*tin 6

我不得不说,那是一个该死的丑陋宏.继续.

宏所做的是计算结构的"项目缓存"(无论是什么)的索引,并返回指向它的指针:(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)

......这更容易理解.为什么它首先是一个宏可能是因为这是遗留代码,从过去的内联函数根本就不存在.

  • @VitalijZadneprovskij在现代(如1990年以前)的编程中,函数应始终优先于宏,除非你真的想使用宏魔法(生成代码,合成标识符等).内联函数将生成与宏完全相同的代码,除了它清晰易读且类型安全. (2认同)

Men*_*ックス 5

每当您_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 + \

注意\行尾的反斜杠。在定义宏时(在该行的末尾)使用该字符时,将使您继续在第二行上书写,就像在第一行继续一样。它可以被认为是使代码可读且不复杂的工具!