【问题标题】:howmany() Macro Objective C多少()宏目标C
【发布时间】:2014-05-15 21:56:08
【问题描述】:

在使用 Xcode 时,我不小心自动完成了宏 howmany(x,y) 并追踪到 types.h。整行内容如下:

#define howmany(x, y)   __DARWIN_howmany(x, y)  /* # y's == x bits? */

这并没有多大意义,所以我沿着路径多走了一点,在_fd_def.h 中找到了__DARWIN_howmany(x, y)。整行内容如下:

#define __DARWIN_howmany(x, y)  ((((x) % (y)) == 0) ? ((x) / (y)) : (((x) / (y)) + 1)) /* # y's == x bits? */

我不知道__DARWIN_howmany(x, y) 做了什么。行尾的注释是否说明了该宏的预期功能?谁能解释一下这个宏的作用、它是如何使用的以及它在_fd_def.h中的相关性

【问题讨论】:

标签: objective-c c macros darwin


【解决方案1】:

这是一个相当常用的宏,可以帮助程序员快速回答问题,如果我有一些东西,而我的容器每个可以容纳 y 个,我需要多少个容器来容纳 x 个东西?

因此,如果您的容器每个可以容纳 5 件东西,而您有 18 个:

  n = howmany(18, 5);

会告诉你,你需要四个容器。或者,如果我的缓冲区是按字分配的,但我需要在其中放入 n 个字符,并且字长为 8 个字符,那么:

  n = howmanu(n, 8);

返回所需的字数。这种计算在缓冲区分配代码中无处不在。

这是经常计算的:

#define howmany(x, y) (((x)+(y)-1)/(y))

同样相关的是roundup(x, y),它将x向上舍入到y的下一个倍数:

#define roundup(x, y) (多少(x, y)*(y))

【讨论】:

    【解决方案2】:

    根据您发布的内容,该宏似乎旨在回答诸如“保存 18 位需要多少 chars?”之类的问题?这个问题可以用这行代码来回答

    int count = howmany( 18, CHAR_BIT );
    

    这会将count 设置为 3。

    该宏首先检查y 是否均分到x。如果是,则返回x/y,否则将x 除以y 并向上取整。

    【讨论】:

    • 但是,根据上面的定义,howmany(18, sizeof(char)) 将产生结果 18 而不是 3! howmany(x,y) 似乎等价于 ((x-1)/(y)+1)。 sizeof(char) 是 1,顺便说一句,从不 8。
    • @Michael 是的,您是对的,感谢您指出这一点。应该是CHAR_BIT,而不是sizeof(char)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2021-12-03
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多