首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从#定义到函数

从#定义到函数
EN

Stack Overflow用户
提问于 2015-03-20 00:07:46
回答 1查看 120关注 0票数 1

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

代码语言:javascript
复制
....
#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的代码是:

代码语言:javascript
复制
#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)

因此,函数中的真正代码只有以下内容:

代码语言:javascript
复制
while (nodes[a].heavyindex != nodes[b].heavyindex) {
        if (nodes[a].heavyindex > nodes[b].heavyindex) {
            ascend(a);
        } else {
            ascend(b);
        }
    }

1)这是对的吗?

2)我希望将#define的代码移动到函数中,以便更好地理解它所做的事情,但是如何翻译下面的一行呢?

代码语言:javascript
复制
m##i = max(m##i + paths[h].ftree.sum(p), paths[h].stree.max_(0, p));\ 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-20 00:22:35

  1. 是。
  2. 正如Ben Voigt在注释中提到的,##是令牌粘贴操作符。因此,在定义了#define f(i) m##i之后,f(a)将扩展到maf(b)将扩展到mb,等等。 因为这只有在预处理器中才有可能,所以您必须考虑其他东西才能将其实现为一个函数。通过引用传递mamb将是一个好主意。它可能看起来像这样: 提升(T& mi) {.mi = max(mi + pathsh.ftree.sum(p),pathsh.stree.max_(0,p));.} 其中Tmamb的类型。如果它们是不同类型的,则需要使其成为函数模板。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29157212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档