通过定义中的内容在 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];?

编辑:

在声明 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 大小相同(尽管从技术上讲它们不必是同一类型)。