繁体   English   中英

通过定义中的内容在 C 中初始化静态数组的大小?

[英]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.cmain.c以外的其他文件都想使用mydata_arr - 所有这些原则上都想知道sizeofmydata_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM