c++ - ARRAYSIZE C++ 宏 : how does it work?

标签 c++ c-preprocessor

好的,我不是完全新手,但我不能说我理解以下宏。最令人困惑的部分是将 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/

相关文章:

c - 在运行时修改结构体字段

c++ - SDL:制作静态文本变量

c++ - 如何通过标准元组操作正确转发和使用 constexpr 结构的嵌套元组

c++ - 如何从相似的模板类构建对象

c++ - 在 .vimrc 中执行映射命令后 vim 不会暂停

C++虚函数行为

c - C/C++ 中的单行 #ifdef

c-preprocessor - 如何在 C 预处理器中生成错误或警告?

c++ - 来自文字的静态 std::string 对象的宏

c++ - 意外#else