首页 > 解决方案 > 一种动态计算传递给函数的不同数组大小的方法

问题描述

所以我理解数组衰减为指针,但没有一种有效的方法来计算数组大小,特别是使用复合文字?

假设我将不同大小的数组传递给函数;理想情况下,我会使用一种动态确定大小的方法,而无需我对数字进行硬编码,但我不能在函数内部开始这样做。剩下的另一个选项是调用者代码,在其中我无法真正更改每个函数调用的静态数组

foo((uint8_t) {1,2});
foo((uint8_t) {1});

标签: carrayssizeof

解决方案


Chris Dodd 建议的一个变体是将您的函数包装在一个宏中:

void real_foo(uint8_t *arr, size_t len);

#define foo(...) real_foo((uint8_t[]) __VA_ARGS__, (sizeof (uint8_t[]) __VA_ARGS__)/sizeof(uint8_t));

// ...

foo({1});
foo({1,2});

试试神器

{1,2}请注意使用可变参数宏来解决被解析为两个宏参数的事实。

对于稍微不同的语法,您还可以编写{ __VA_ARGS__ }宏定义,以便您可以将其调用为

foo(1);
foo(1,2);

如果您愿意使用 gcc/clang 语句表达式(非标准 C 扩展),您还可以宏化 supercat 的解决方案:

#define foo(...) ({ static const uint8_t my_array[] = { __VA_ARGS__ }; real_foo(my_array, sizeof(my_array) / sizeof(uint8_t)); })

或者如果real_foo()返回void,您可以执行以下标准 C:

#define foo(...)  do { static const uint8_t my_array[] = { __VA_ARGS__ }; real_foo(my_array, sizeof(my_array) / sizeof(uint8_t)); } while (0)

哪里do/while吃分号

这当然假设real_foo()不需要修改数组。如果是这样,即使没有 , 这也不起作用const,因为如果再次执行代码,则不会重新初始化数组。

另一种选择是重新设计您的函数,以便不需要告诉它数组的大小。例如,如果有一些值作为数组的条目无效,则可以将其用作哨兵:

foo((uint8_t []){1, 2, 0xff});

推荐阅读