c - 一种动态计算传递给函数的不同数组大小的方法
问题描述
所以我理解数组衰减为指针,但没有一种有效的方法来计算数组大小,特别是使用复合文字?
假设我将不同大小的数组传递给函数;理想情况下,我会使用一种动态确定大小的方法,而无需我对数字进行硬编码,但我不能在函数内部开始这样做。剩下的另一个选项是调用者代码,在其中我无法真正更改每个函数调用的静态数组
foo((uint8_t) {1,2});
foo((uint8_t) {1});
解决方案
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});
推荐阅读
- c++ - 为什么 cin.ignore() 忽略我的 getline 输入的第一个字符?
- sql-server-2016 - 在 SQL Server 2017 上创建具有 800+ 百万行的现有分区表的列存储索引
- apache-spark - Spark Window Functions:每帧/范围计算一次?
- javascript - 在给它一个无效值时,是否可以使 jQuery DateTimePicker 不默认为当前日期和时间?
- laravel-backpack - 如何将背包克隆功能用于独特的字段形式
- git - 如何使用 GitHub Actions 创建孤立(不相关)分支
- android - android上的react-native出现“TypeError:网络请求失败”之类的错误
- python - 添加多个 Python Selenium WebDriverWait 异常以下载元素
- javascript - 在带有 analytics.js 片段的网站上使用 GTM 设置 ClientId?
- laravel - 定制的 Laravel Nova 视图 - 包括完整的孩子详细信息