在结构中初始化指针成员
问题描述:
我想写一个模块,它将从微控制器读取一个特定的地址值,初始化代码自己编译,但是当我尝试在一个结构内编译它似乎抱怨。在结构中初始化指针是否有限制?在结构中初始化指针成员
#include <stdio.h>
#include <esper.h>
#include <stdlib.h>
#include <stdint.h>
#include "lmk04800.h"
#define NUM_MSS_GPIO 32
#define SEL_NIM 3
#define SOURCE_SEL 4
#define SEL_EXT 5
#define CLK0_3_EN 6
#define CLK4_7_EN 7
#define CLK8_11_EN 8
#define CLK12_15_EN 9
#define CLK16_19_EN 10
#define CLK20_23_EN 11
#define LMK_SYNC 12
typedef struct {
int fd_gpio[NUM_MSS_GPIO];
uint8_t data_gpio[NUM_MSS_GPIO];
uint32_t esata_freqCounter;
uint32_t ext_freqCounter;
uint32_t esata_trgCounter;
uint32_t ext_trgCounter;
tLMK04800 settings;
volatile uint32_t *freqCounter_addr;
volatile uint32_t *trgCounter_addr;
volatile uint32_t *manSync_addr;
freqCounter_addr = (volatile uint32_t *)0x30000000;
trgCounter_addr = (volatile uint32_t *)0x30000100;
manSync_addr = (volatile uint32_t *)0x30000200;
} tESPERModuleTest;
的编译错误我得到的是:
test/mod_test.h:32: error: expected specifier-qualifier-list before 'freqCounter_addr'
答
当你定义类型,你不能定义结构成员的初始值。如果允许,它可能很有用,并且初始值将自动应用于该类型的任何对象。 C只是不允许它。
您只能初始化对象。
您已经定义了一个名为tESPERModuleTest
的类型。如果要定义和初始化类型的对象,你可以定义类型(未经测试的代码)后,做这样的事情:
tESPERModuleTest obj = {
.freqCounter_addr = (volatile uint32_t *)0x30000000,
.trgCounter_addr = (volatile uint32_t *)0x30000100,
.manSync_addr = (volatile uint32_t *)0x30000200
};
(其他成员将是默认初始化为零,或者您也可以提供值为他们)。
+0
这是为什么这是一个特别的原因? – Lpaulson
+0
这可能只是为了保持语言简单。我记得,C++最近才添加了这个功能。 –
使它只是'(uint32_t *)'。 –
我不确定,但将volatile指针定义为volatile并不能保证它指向正确值的任何内容。 –
只需确认 - 'lmk04800.h'文件中指定了'tLMK04800',对吧? 'lmk04800.h'被编译器找到了,对吧? –