使用指向外部结构元素的指针进行静态数组初始化?
Static array initialization with pointer to extern struct element?
我想静态初始化一个数组,但它的一些元素是指向外部结构的指针。
我不能将结构声明为常量,因为它们的元素在别处被修改,既不是静态的,因为它与外部声明冲突。
有没有办法在静态数组初始化中解决这个问题,或者我必须在函数中初始化它?
编辑:
在一次出色的发布后查看您的示例,我发现错误是我使用的是 PWMD2
而不是 &PWMD2
(其中 PWMD2 是外部结构)。
显然错误是
error: initializer element is not constant
为了指出我在做什么,部分代码(使用 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},
};
详细说明你的问题,因为以下对我来说没问题,据我所知这就是你要求做的:
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
例如,以下应该有效。你得到什么错误?你在什么编译器和平台上? (您可以酌情删除 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
我想静态初始化一个数组,但它的一些元素是指向外部结构的指针。
我不能将结构声明为常量,因为它们的元素在别处被修改,既不是静态的,因为它与外部声明冲突。
有没有办法在静态数组初始化中解决这个问题,或者我必须在函数中初始化它?
编辑:
在一次出色的发布后查看您的示例,我发现错误是我使用的是 PWMD2
而不是 &PWMD2
(其中 PWMD2 是外部结构)。
显然错误是
error: initializer element is not constant
为了指出我在做什么,部分代码(使用 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},
};
详细说明你的问题,因为以下对我来说没问题,据我所知这就是你要求做的:
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
例如,以下应该有效。你得到什么错误?你在什么编译器和平台上? (您可以酌情删除 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