通过定义中的内容在 C 中静态数组初始化的大小?
Size of static array initialization in C via contents in define?
在 上也有类似的讨论 - 但我仍然无法确定我的案例中的所有机会是否已经用尽。
考虑以下示例文件(我 运行 这些在 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/ 中找到的评论我认为总结了问题:
The compiler can’t practically see arbitrary definitions outside of the starting file or what it #includes, because definitions might not exist yet (or at all, up until load time, or at all, ever).
the compiler compiles each source file individually, with references to elements in external source files that need to be handled by the linker. This is why we generally either pass an array with a length in the function prototype ...
If the compiler can’t directly see the size of the thing, it can’t give you a value for 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 中有没有一种方法可以使用“define”_my_data
来获取相应数组的大小——这样一来,我就不必通过 [= 明确指定大小了26=] 在头文件中 - 但我仍然可以在代码中使用 sizeof
来获得数组中正确的大小(元素数)?
- 我需要在头文件中声明为
extern
,因为在我的实际用例中,除 ext.c
和 main.c
之外的其他文件都希望使用 mydata_arr
- 所有这些原则上都想知道 sizeof
mydata_arr
;
- 我不想将
mydata_arr
的元素 count/number 保存在单独的变量中 - 考虑到 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
大小相同(尽管从技术上讲它们不必是同一类型)。
在
考虑以下示例文件(我 运行 这些在 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/ 中找到的评论我认为总结了问题:
The compiler can’t practically see arbitrary definitions outside of the starting file or what it #includes, because definitions might not exist yet (or at all, up until load time, or at all, ever).
the compiler compiles each source file individually, with references to elements in external source files that need to be handled by the linker. This is why we generally either pass an array with a length in the function prototype ...
If the compiler can’t directly see the size of the thing, it can’t give you a value for 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 中有没有一种方法可以使用“define”_my_data
来获取相应数组的大小——这样一来,我就不必通过 [= 明确指定大小了26=] 在头文件中 - 但我仍然可以在代码中使用sizeof
来获得数组中正确的大小(元素数)? - 我需要在头文件中声明为
extern
,因为在我的实际用例中,除ext.c
和main.c
之外的其他文件都希望使用mydata_arr
- 所有这些原则上都想知道sizeof
mydata_arr
; - 我不想将
mydata_arr
的元素 count/number 保存在单独的变量中 - 考虑到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
大小相同(尽管从技术上讲它们不必是同一类型)。