隐式大小的数组声明中的 sizeof(array)
sizeof(array) within array declaration of implicit size
考虑以下常见的数组定义,注意数组本身必须包括总大小:
#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);
考虑以下常见的数组定义,注意数组本身必须包括总大小:
#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);