【发布时间】:2017-03-13 11:00:47
【问题描述】:
我经常这样写:
for (size_t i = 0; i < sizeof(some_variable) / sizeof(some_variable[0]); i++) {
// ...
}
从这个question我也可以写一个宏比如:
#define ArrayLength(x) (sizeof(x)/sizeof(x[0]))
但是我觉得这并不是一个在宏下混淆这个非常简单的东西的好方法。
C99 或 C11 定义了更好的替代方案吗?
由于这种样板语法,我经常发现我的同事对变量的大小进行硬编码,或者更糟的是,像这样使用define:
#define ELEMENTS 23
int foo[ELEMENTS];
for (size_t i; i < ELEMENTS; i++);
【问题讨论】:
-
什么样的选择?您在寻找一些 API 吗?
-
据我所知,宏是最好的
-
不,还要注意如果
some_variable作为参数传递给函数,上面的代码将不起作用 -
在
stddef你可以找到例如offsetof这非常有用。这是在结构中获取偏移成员的标准化方法。我正在寻找与此类似的东西,可能称为elementsof -
@Marian 没用,因为你丢失了宝贵的信息:
ELEMENTS属于foo。如果您只使用ELEMENTS来代替foo并对其进行迭代,那么使用sizeof(foo) / sizeof(foo[0])会更好。此外,由于foo的大小无法直接读取,因此您的代码更难阅读,您必须寻找可能在上方某处找到的ELEMENTS。