我需要将大量常量数据存储在头文件中。由于数据的性质(嵌套的方式),我决定使用由预处理器初始化的结构。
我试图像这样初始化这些结构:
typedef struct s_PWM {
uint8_t muxmode;
char *name;
char *path;
} PWM;
typedef struct s_PIN {
char *name;
uint8_t gpio;
char *mux;
uint8_t eeprom;
PWM *pwm;
} PIN;
这将允许我做类似
的事情PIN p1 = P8_19;
从某种意义上说,组装一个具有适当属性的结构。
基本上,您可以将引脚发送到函数
pinMode(P8_19, OUTPUT)
这是有问题的一行
#define P8_19 ((PIN){"EHRPWM2A", 22, "gpmc_ad8", 14, (PWM*){4, "EHRPWM2A", "ehrpwm.2:0"}})
这是警告
src/gpio.c:50:2: warning: excess elements in scalar initializer
src/gpio.c:50:2: warning: (near initialization for '(anonymous)')
src/gpio.c:50:2: warning: excess elements in scalar initializer
src/gpio.c:50:2: warning: (near initialization for '(anonymous)')
有没有人知道为什么会这样?我是否错误地将PWM *结构嵌套到PIN结构中?
答案 0 :(得分:0)
简短回答:是的。
不要使用指针,而应直接使用结构:
typedef struct s_PIN {
char *name;
uint8_t gpio;
char *mux;
uint8_t eeprom;
PWM pwm; /* Notice: not a pointer */
} PIN;
此外,您不需要进行投射:
#define P8_19 {"EHRPWM2A", 22, "gpmc_ad8", 14, {4, "EHRPWM2A", "ehrpwm.2:0"}}
答案 1 :(得分:0)
#define P8_19 ((PIN){"EHRPWM2A", 22, "gpmc_ad8", 14, (PWM*){4, "EHRPWM2A", "ehrpwm.2:0"}})
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
标记的部分不是指针。
答案 2 :(得分:0)
我会稍微区别对待这个问题;我会在自己的模块中定义引脚名称,如下所示。
gpio.h
:
typedef struct s_PWM {
uint8_t muxmode;
char *name;
char *path;
} PWM;
typedef struct s_PIN {
char *name;
uint8_t gpio;
char *mux;
uint8_t eeprom;
PWM *pwm;
} PIN;
...
extern PIN * P8_19;
gpio.c
:
PWM _P8_19_PWM = {4, "EHRPWM2A", "ehrpwm.2:0"};
PIN _P8_19 = {"EHRPWM2A", 22, "gpmc_ad8", 14, &_P8_19_PWM};
PIN *P8_19 = &_P8_19;
然后您可以通过包含gpio.h
并正常使用P8_19在其他文件中引用它。