【问题标题】:Avoid boilerplate syntax sizeof(x) / sizeof(x[0]) in C避免 C 中的样板语法 sizeof(x) / sizeof(x[0])
【发布时间】: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

标签: c syntax sizeof


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    更好的选择,它不会让人类读者对实际的实现或目的感到疑惑。无论如何,任何半体面的编译器都会执行所需的优化(无论如何都适用)。

    【讨论】:

    • 这是一个不错的选择,但它通常大于 76 或 80 个字符,所以如果你想与 MISRA 兼容,你必须打破界限。
    • @nowox 好吧,我不反对,但这是对特定子集的限制,没有来自母语方面的限制,是吗? :)
    • 如果这个宏是一个在整个项目中使用的非常基本的头文件中定义的实用程序,这不是真正的问题。用户很快就掌握了如何使用这个宏。
    • @nowox 您不必换行。使用存储大小的变量。
    • 也许我是一个老教条主义者,但如果有人为此使用宏,我会完全弹道 - 因为担心如果将循环移动到函数中,指针会衰减,并且数组传递给它。
    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 2012-01-03
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多