好的,我不是完全新手,但我不能说我理解以下宏。最令人困惑的部分是将 value 转换为 size_t 的除法:这到底完成了什么?特别是,因为我看到一个否定运算符,据我所知,它可能会导致零值。这是否意味着它会导致被零除的错误? (顺便说一下,宏 是正确的,而且效果很好。)
#define ARRAYSIZE(a) \
((sizeof(a) / sizeof(*(a))) / \
static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
最佳答案
第一部分 (sizeof(a)/sizeof(*(a)))
相当简单;它将整个数组的大小(假设您将宏传递给数组类型的对象,而不是指针)除以第一个元素的大小。这给出了数组中元素的数量。
第二部分不是那么简单。我认为潜在的除零是故意的。如果由于某种原因数组的大小不是其元素之一的整数倍,则会导致编译时错误。换句话说,它是某种编译时完整性检查。
但是,我不知道在什么情况下会发生这种情况...正如人们在下面的评论中所建议的那样,它会发现 一些 误用(例如使用 ARRAYSIZE()指针上的
)。但是,它不会捕获所有这样的错误。
关于c++ - ARRAYSIZE C++ 宏 : how does it work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4064134/