避免 C 中的样板语法 sizeof(x) / sizeof(x[0])

Avoid boilerplate syntax sizeof(x) / sizeof(x[0]) in C

我经常这样写:

for (size_t i = 0; i < sizeof(some_variable) / sizeof(some_variable[0]); i++) {
   // ...
}

从这个question我也可以写一个MACRO如:

#define ArrayLength(x) (sizeof(x)/sizeof(x[0]))

但是我觉得这并不是一个很好的解决方案,可以在宏下混淆这个非常简单的东西。

是否有 C99 或 C11 定义的更好的替代方案?

由于这种样板语法,我经常发现我的同事硬编码变量的大小或更糟,使用这样的 define

#define ELEMENTS 23
int foo[ELEMENTS];
for (size_t i; i < ELEMENTS; i++);

最好的办法是为数组中的元素数量维护一个单独的参数。

然后,当您将代码移动到 函数 中时,由于指针衰减而潜入的所有错误将不再发生。

如果做不到这一点,请始终拼出 sizeof 习语。

不,没有什么可以帮助您的。您必须坚持使用上述任一选项。

也就是说,在我个人看来,虽然定义和使用 MACRO 绝对是一个正确且可行的选择,

 for (size_t i = 0; i < sizeof(some_variable) / sizeof(some_variable[0]); i++) {

更好的选择,它不会让人类 reader想知道实际的实施或目的,因为那件事。无论如何,任何半正经的编译器都会执行所需的优化(适用)。