+-
考虑以下常见的数组定义,请注意,数组本身必须包括总大小:
#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。在需要在编译时定义一个需要存储其大小的数组的情况下,最佳实践是什么?我猜可能是保留该位置并在运行时设置它的选项,在我看来,这可以工作,但也可能阻止将其保存在只读存储器中。
0
投票
投票
#define INIT 0xFF, 0x00
#define SOF(x) (sizeof((char []){x})+1)
char buffer[] =
{
SOF(INIT) , INIT
};