使用指向extern struct元素的指针进行静态数组初始化?

时间:2015-03-06 11:40:15

标签: c arrays initialization

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

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

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

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

显然错误是

  

错误:初始化元素不是常量

只是要指出我在做什么,部分代码(使用ChibiOS)如下:

esc.h

extern struct Engine{
    GPIO_TypeDef *gpio;
    uint8_t pin;

    PWMDriver *driver;
    pwmchannel_t channel;
    pwmcnt_t width;
}engines[];

esc.c

struct Engine engines[] = {
    {GPIOD, 3, &PWMD2, 0, 0},
    {GPIOD, 4, &PWMD2, 1, 0},
    {GPIOD, 6, &PWMD2, 2, 0},
    {GPIOD, 7, &PWMD2, 3, 0},
};

2 个答案:

答案 0 :(得分:1)

详细说明你的问题,因为以下对我来说没问题,而且就我所知,你要求做的是:

的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;
}

externs.h

#ifndef EXTERNS_H
#define EXTERNS_H

typedef struct {
    int value;
    } struct_int_t;

extern struct_int_t extint;

#endif

externs.c

#include "externs.h"

struct_int_t extint = { 10 };

编译:

C:\>gcc main.c externs.c

运行:

C:\>a
extint: 10

答案 1 :(得分:1)

以下应该起作用。你得到了什么错误?你在做什么编译器和平台? (您可以根据需要删除const - 它们不是必需的。)

struct.h

typedef struct My_struct {
    int n;
} My_struct;

extern const My_struct s1, s2;

struct.c

#include "struct.h"

const My_struct s1 = { 1 }, s2 = { 2 };

arr.c

#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