gpt4 book ai didi

c - 最佳实践 : declaring global arrays of fixed length automatically

转载 作者:行者123 更新时间:2023-11-30 18:33:16 24 4
gpt4 key购买 nike

我有一个数据结构,我想在项目中的文件之间全局共享。

mystruct_s data[] = {
{ // element 1
}, { // element 2 ...
}, { 0 } // element N is zero to mark array end
}

在同一文件中,对象引用数据。它的类型读作mystruct_s[N]。这很好而且很简单。

在头文件中,我有:

mystruct_s data[];

在其他文件中,我收到类型不匹配警告,因为它被假定为 1 元素数组。

我根据数组内容计算长度,因此不需要知道sizeof。一个好的老式指针 mystruct_s* 就可以了。

  1. 如何自动将数组的长度传播到另一个文件中?如果我必须手动计算每个元素并将该计数放入标题中,这将是一个维护噩梦。
    • 我是否应该用一些随机数字来声明它,然后#pragma 忽略警告?
  2. 如何将数组本身声明为未知数组或单元素数组(任何数组都可以)或指针?
    • 我不需要指针变量,而且在 AVR 平台上执行此操作似乎很复杂,其中数组应存储在 PROGMEM 中。如果我声明一个指针,它希望将指针变量放入PROGMEM中。这不是很有用。然后它指向的数组在某个地方变成了一个未命名的对象。 (编译器(GCC 8.1.0)不喜欢这个,所以我不确定它到底认为我正在尝试什么......)
  3. 如果这是错误的方法,我应该如何处理这个问题?把所有东西都扔到标题中? (我确实喜欢对数据 block 使用头文件,但我更喜欢在不需要维护的 block 上这样做;因为这些元素引用 .c 文件中的其他对象,所以放置 data[] 也在那里。)

最佳答案

我声明全局变量并让其他模块知道它们的首选方法如下:

// to define global variables, use the following:

// module.c
#include "glo.h"

// glo.h
#ifndef EXTERN
# define EXTERN extern
#endif
EXTERN int myvar;

#define ARR_SIZE 123
EXTERN int myArr[ARR_SIZE];

// main.c
#define EXTERN
#include "glo.h"

这会为 main 中的全局变量分配存储空间,并使它们在所有其他模块中称为 extern

这扩展为:

// module.c
extern int myvar;
extern int myArr[123];

并且在主要部分:

// main.c allocates storage
int myvar;
int myArr[123];

编辑

您需要知道数组大小,不是通过定义的常量,而是基于初始化器的数组大小。可能一个好方法是为所有其他模块定义具有虚拟大小的数组,并提供数组大小作为单独的全局变量,在初始化后在 main 中初始化。

// glo.h
#ifndef EXTERN
# define EXTERN extern
extern int myArr[2];
#endif
EXTERN int gArrSize;

和:

// main.c
#define EXTERN
#include "glo.h"
int myArr[] = { 1, 2, 3, 4, 0};
int gArrSize= sizeof(myArr)/sizeof(myArr[0]);

关于c - 最佳实践 : declaring global arrays of fixed length automatically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58604087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com