gpt4 book ai didi

c++ - 从#define 到函数

转载 作者:太空宇宙 更新时间:2023-11-04 03:40:24 24 4
gpt4 key购买 nike

我在一个函数中有这段代码,但我无法理解它的作用。

....
#define ascend(i) do {\
int h = nodes[i].heavyindex;\
int p = nodes[i].heavypos;\
m##i = max(m##i + paths[h].ftree.sum(p), paths[h].stree.max_(0, p));\
i = paths[h].parent;\
} while (0)
while (nodes[a].heavyindex != nodes[b].heavyindex) {
if (nodes[a].heavyindex > nodes[b].heavyindex) {
ascend(a);
} else {
ascend(b);
}
}
#undef ascend
...

我认为#define的代码是:

#define ascend(i) do {\
int h = nodes[i].heavyindex;\
int p = nodes[i].heavypos;\
m##i = max(m##i + paths[h].ftree.sum(p), paths[h].stree.max_(0, p));\
i = paths[h].parent;\
} while (0)

所以函数内部的真正代码只有这样:

while (nodes[a].heavyindex != nodes[b].heavyindex) {
if (nodes[a].heavyindex > nodes[b].heavyindex) {
ascend(a);
} else {
ascend(b);
}
}

1)是吗?
2) 我想将 #define 的代码移到一个函数中以更好地理解它的作用,但我如何翻译以下行?

m##i = max(m##i + paths[h].ftree.sum(p), paths[h].stree.max_(0, p));\ 

最佳答案

  1. 是的。
  2. Ben Voigt 所述在注释中,## 是标记粘贴运算符。因此,在定义了 #define f(i) m##i 后,f(a) 将扩展为 maf(b ) 将扩展为 mb 等。

    由于这只能通过预处理器实现,因此您必须想出其他办法将其实现为一个函数。通过引用传递 mamb 是个好主意。它可能看起来像这样:

    ascend(T& mi) {
    ...
    mi = max(mi + paths[h].ftree.sum(p), paths[h].stree.max_(0, p));
    ...
    }

    其中 Tmamb 的类型。如果它们是不同的类型,则需要将其设为函数模板。

关于c++ - 从#define 到函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29157212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com