C 静态数组初始化,指针指向外部结构元素?

C 静态数组初始化,指针指向外部结构元素?,c,arrays,initialization,C,Arrays,Initialization,我想静态初始化一个数组,但它的一些元素是指向外部结构的指针 我不能将结构声明为常量,因为它们的元素在别处被修改,也不能是静态的,因为它与外部声明冲突 有没有办法在静态数组初始化中解决这个问题,或者我必须在函数中初始化它 编辑: 在一次伟大的发布后查看您的示例,我发现错误在于我使用的是PWMD2,而不是&PWMD2(其中PWMD2是外部结构) 很明显,这个错误是错误的 错误:初始值设定项元素不是常量 为了指出我正在做什么,部分代码(使用ChibiOS)如下所示: esc.h esc.c 请详细说明

我想静态初始化一个数组,但它的一些元素是指向外部结构的指针

我不能将结构声明为常量,因为它们的元素在别处被修改,也不能是静态的,因为它与外部声明冲突

有没有办法在静态数组初始化中解决这个问题,或者我必须在函数中初始化它

编辑: 在一次伟大的发布后查看您的示例,我发现错误在于我使用的是
PWMD2
,而不是
&PWMD2
(其中PWMD2是外部结构)

很明显,这个错误是错误的

错误:初始值设定项元素不是常量

为了指出我正在做什么,部分代码(使用ChibiOS)如下所示:

esc.h

esc.c


请详细说明您的问题,因为以下几点对我来说是可行的,就我所知,这就是您要求做的:

main.c

#include <stdio.h>

#include "externs.h"

static struct_int_t* initextint[1] = { &extint };

int main( int argc, char* argv[] )
{
    printf( "extint: %d\n", initextint[0]->value );
    return 0;
}
外部人员

#include "externs.h"

struct_int_t extint = { 10 };
汇编:

C:\>gcc main.c externs.c
运行:


例如,下面的内容应该适用。你犯了什么错误?您使用的是什么编译器和平台?(您可以根据需要删除
const
s,它们不是必需的。)

结构h:

结构c:

arr.c:


你写了什么代码,犯了什么错误?每当你遇到像这样的人为问题时,听起来程序设计不知何故被破坏了。那么,解决这个问题的真正办法就是修改程序设计。@Lundin你能解释一下你的意见吗?你所说的“人为问题”是什么意思?设计是如何被破坏的?这句话:“我想静态初始化一个数组,但它的一些元素是指向外部结构的指针”,听起来像是用各种全局变量进行意大利面编码。要么所有变量都是常量,然后就可以了,要么不是,在这种情况下,应该在运行时设置结构。如果我想根据您发布的内容猜一下程序的功能,您有一个使用PWM和GPIO的引擎驱动程序。在这种情况下,这些资源可能应该在运行时传递给驱动程序。此外,在编写嵌入式系统时,依赖静态存储持续时间变量的预初始化通常是不好的做法。在使用变量之前,应始终在运行时手动初始化它们。因为在一个真正的嵌入式系统上,除了运行时之外什么都不存在:你不想在程序开始时依赖于一些复制下来的代码片段,而且有时出于性能原因,你也不想在启动时使用它。大多数编译器都支持从.data/.bss中删除副本的非标准方式,这通常是默认设置。
#ifndef EXTERNS_H
#define EXTERNS_H

typedef struct {
    int value;
    } struct_int_t;

extern struct_int_t extint;

#endif
#include "externs.h"

struct_int_t extint = { 10 };
C:\>gcc main.c externs.c
C:\>a
extint: 10
typedef struct My_struct {
    int n;
} My_struct;

extern const My_struct s1, s2;
#include "struct.h"

const My_struct s1 = { 1 }, s2 = { 2 };
#include <stdio.h>
#include "struct.h"

static const My_struct *const arr[2] = { &s1, &s2 };

int main(void) {
    printf("arr[0]->n = %d, arr[1]->n = %d\n", arr[0]->n, arr[1]->n);

    return 0;
}
$ gcc arr.c struct.c -o struct_arr