c - 隐式大小的数组声明中的 sizeof(array)
问题描述
考虑以下常见的数组定义,注意数组本身必须包含总大小:
#define BUFSZ 3
uint8_t buffer[BUFSZ] = {
BUFSZ, 0xFF, 0x00
}
当您大量更改缓冲区并且它变得足够大以至于跟踪每个更改比每次从头开始计数更容易时,这不是很方便。当然,这样的事情是可能的:
#define BUFSZ 3
uint8_t buffer[BUFSZ] = {
sizeof(buffer), 0xFF, 0x00
}
或相反
#define BUFSZ 3
uint8_t buffer[] = {
BUFSZ, 0xFF, 0x00
}
但是完全不需要计数的两者的组合是不可能的:
uint8_t buffer[] = {
sizeof(buffer), 0xFF, 0x00
}
这导致
invalid application of 'sizeof' to incomplete type 'uint8_t[]' {aka 'unsigned char[]'}
注意我使用的是 arm-none-eabi-gcc 编译器,但这也适用于 gcc。
对于需要在编译时定义一个需要存储其大小的数组的情况,最佳实践是什么?
我想一个选项可能是保留该位置并在运行时设置它,这在我的情况下可以工作,但也可能阻止它保存在只读内存中。
解决方案
#define INIT 0xFF, 0x00
#define SOF(x) (sizeof((char []){x})+1)
char buffer[] =
{
SOF(INIT) , INIT
};
或者
#define SOF(name, ...) char name[] = {(sizeof((char []){__VA_ARGS__})+1), __VA_ARGS__}
SOF(buffer,255,0);
推荐阅读
- azure - 如何使用 terraform 创建 azure repos 分支
- mysql - 根据 eventID 获取数据
- jquery - 仅在 ios 设备上隐藏特定 div
- vbscript - 运行隐藏文件
- c++ - 如果目录路径太长,SetupGetInfFileList 函数将失败并显示 ERROR_INSUFFICIENT_BUFFER
- google-cloud-platform - BigQuery Arrays - 检查 Array 是否包含特定值
- flutter - 修改模型以适应 null fafety
- javascript - 如何在我的网络应用程序中跟踪当前用户?
- javascript - 为什么在 React 中满足条件时没有返回 div?
- r - 当我想在 R 中加载“rmgarch 和 rugarch”包时有什么问题?