[英]Size of static array initialization in C via contents in define?
关于C 中静态数组初始化的 Count number of elements也有类似的讨论 - 但我仍然无法判断我的案例中的所有机会是否都已用尽。
考虑以下示例文件(我在可以处理多个文件的https://www.onlinegdb.com/online_c_compiler中运行这些文件)
ext.h
#include <inttypes.h>
#define _my_data 0x11, 0x22, 0x33, 0x44, 0x55, 0x66
extern const uint8_t mydata_arr[];
ext.c
#include "ext.h"
const uint8_t mydata_arr[] = { _my_data };
main.c
#include <stdio.h>
#include "ext.h"
int main()
{
printf("First mydata_arr item: 0x%02X\n", mydata_arr[0]); // ok
printf(" size: %d\n", sizeof(mydata_arr));
return 0;
}
这失败了:
main.c:15:34: error: invalid application of ‘sizeof’ to incomplete type ‘const uint8_t[]’ {aka ‘const unsigned char[]’}
15 | printf(" size: %d\n", sizeof(mydata_arr));
| ^
我在https://www.reddit.com/r/C_Programming/comments/esu4ff/error_invalid_application_of_sizeof_to_incomplete/ffc6u19/中找到的评论总结了这个问题:
编译器实际上无法看到起始文件之外的任意定义或其#includes,因为定义可能还不存在(或者根本不存在,直到加载时间,或者根本不存在)。
编译器单独编译每个源文件,并引用外部源文件中需要由链接器处理的元素。 这就是为什么我们通常要么在函数原型中传递一个具有长度的数组......
如果编译器不能直接看到事物的大小,它就不能给你一个 sizeof 的值。
好的,所以我明白为什么我无法从头文件中获取extern const uint8_t mydata_arr[]
的sizeof(mydata_arr)
。
但问题是 - 我的数据实际上在#define _my_data
中(但它不是字符串,因为缺少引号 - 尽管我不确定预处理器如何看到_my_data
的内容)。
所以,我想知道:C 中有没有办法使用“定义” _my_data
来获得相应数组的大小——而不必使用 sizeof
,这需要明确地说extern const uint8_t mydata_arr[6];
在头文件中?
编辑:
:)
)。 应该是:在 C 中有没有办法使用“定义” _my_data
来获取相应数组的大小 - 这样我就不必通过extern const uint8_t mydata_arr[6]
在头文件中 - 但我仍然可以在代码中使用sizeof
来获得数组中的正确大小(元素数)?extern
,因为在我的实际用例中, ext.c
和main.c
以外的其他文件都想使用mydata_arr
- 所有这些原则上都想知道sizeof
的mydata_arr
;mydata_arr
元素的计数/数量保存在单独的变量中 - 考虑到sizeof
已经存在在声明mydata_arr
时,您可以使用复合文字作为sizeof
的操作数。
#define _my_data 0x11, 0x22, 0x33, 0x44, 0x55, 0x66
extern const uint8_t mydata_arr[sizeof ((uint8_t[]) {_my_data}) / sizeof(uint8_t)];
^^ compound literal ^^
顺便提一句。 sizeof(uint8_t)
保证为1
,因为它与unsigned char
的大小相同(尽管从技术上讲,它们不必是相同的类型)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.