Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C sizeof(数组)在隐式大小的数组声明中_C_Arrays_Gcc_Sizeof - Fatal编程技术网

C sizeof(数组)在隐式大小的数组声明中

C sizeof(数组)在隐式大小的数组声明中,c,arrays,gcc,sizeof,C,Arrays,Gcc,Sizeof,考虑以下常见数组定义,请注意数组本身必须包含总大小: #define BUFSZ 3 uint8_t buffer[BUFSZ] = { BUFSZ, 0xFF, 0x00 } 当您大量更改缓冲区时,这不是很方便,而且它变得足够大,以至于跟踪每次更改比每次从头开始计数更容易。 当然,这样的事情是可能的: #define BUFSZ 3 uint8_t buffer[BUFSZ] = { sizeof(buffer), 0xFF, 0x00 } 或者反过来说 #define B

考虑以下常见数组定义,请注意数组本身必须包含总大小:

#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
}
这将导致
对不完整类型“uint8_t[]”{aka“unsigned char[]”应用“sizeof”无效

注意,我使用的是arm ONE eabi gcc编译器,但这也适用于gcc

对于需要在编译时定义数组并存储其大小的情况,最佳做法是什么
我想一个选择可能是保留该位置并在运行时设置它,在我的情况下,这可以工作,但也可以防止它保存在只读内存中

#define  INIT   0xFF, 0x00
#define  SOF(x) (sizeof((char []){x})+1)

char buffer[] =
{
    SOF(INIT) , INIT
};


在C语言中恐怕没有办法做到这一点。你能做的最好的事情就是你的第一个例子。此外,
[]
案例中的数组大小在编译器完成对初始值设定项的解析之前是未知的。根据您的使用案例,外部生成此类数组可能是一种选择:使用脚本或单独的程序使用数组生成数据文件,然后包含该文件。将生成集成到构建过程中。谢谢,这很不幸。是的,对于一些数据来说,这是有意义的,尽管这是硬编码的USB设置数据,所以现在必须这样做。将在运行时用sizeof覆盖该位置,至少在活动开发期间是这样。如果您不怕宏,您可以编写一个宏,通过对复合数组文本使用
sizeof(a)/sizeof(*a)
技巧来确定参数的数量:。^^^^我很喜欢这样,需要进行一些修改才能将大小设置在特定位置,但它仍然允许类似于数组的DataVenture选项条目,通过创建单独的数组很好地避免了“不完整类型”错误。虽然现在输入这些数据会很痛苦,但所有这些数据都是普通的或单行的。见经修正的答复
#define  SOF(name, ...) char name[] = {(sizeof((char []){__VA_ARGS__})+1), __VA_ARGS__}

SOF(buffer,255,0);