如何在 C 中初始化 Const 结构 - 避免 QAC 警告
How to Initialize a Const Structure in C - To Avoid QAC warnings
我在初始化常量结构时收到以下 QAC 警告。
"[C] Initializer for 'struct', 'union' or array type, or any object with static storage duration, must be a constant "
FPARM1C2.c
const PROFI_tstBlock FPARM_astFblBlockTable[] = {FPARM_ast_FblBlock_Table};
const PROFI_tstPartition FPARM_astFblPartitionTable[] = {FPARM_ast_FblPartition_Table};
以上声明导致 QAC 警告。
FPARM1CA.H
#define FPARM_ast_FblBlock_Table \
0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x00020000 , 0x00000000 , 0x00001000 , 0x00000000 , FPARM_nMemTypeIntFlash1 , 0x01 , 0x0000 , FPARM_bi8DataBlock | FPARM_bi8CommonBlock , 0x0000
#define FPARM_ast_FblPartition_Table \
(uint32)__ghsbegin_FLoaderIdent, (uint32)0x0, (uint32)FPARM_astFblBlockTable, (uint32) 0x0, 1, 0, 0x00, 0x00, 0x00, 0x00
Profi1c1.h
typedef struct PROFI_tstPartition
{
uint32 xAddressID;
uint32 u32Reserved1;
uint32 xBlockTableAdr;
uint32 u32Reserved2;
uint16 u16NumberOfBlocks;
uint16 u16GlobalProperties;
uint8 au8Reserved[4];
} PROFI_tstPartition;
typedef struct PROFI_tstBlock
{
uint32 xPhysicalAddress;
uint32 u32Reserved1;
uint32 xLogicalAddress;
uint32 u32Reserved2;
uint32 xBlockLength;
uint32 u32Reserved3;
uint32 xSectorSize;
uint32 u32Reserved4;
uint8 u8BlockMemoryType;
uint8 u8Security;
uint16 u16Reserved;
uint16 u16BlockProperties;
uint16 u16Reserved2;
} PROFI_tstBlock;
是否有任何类型转换或更好的方法来初始化 const 结构以避免警告?
任何具有静态存储持续时间的变量都不能从另一个变量初始化。所以如果它是一个数组,它不能包含对初始化列表中其他变量的任何引用。
不要做这样的事情:
const type1 array1 [] = {1, 2, 3};
const type2 array2 [] = {0, array1, 0}; // won't work
而是做这样的事情:
#define ARRAY1_INIT { 1, 2, 3 }
const type1 array1 [] = ARRAY1_INIT;
const type2 array2 [] = {0, ARRAY1_INIT, 0};
我在初始化常量结构时收到以下 QAC 警告。
"[C] Initializer for 'struct', 'union' or array type, or any object with static storage duration, must be a constant "
FPARM1C2.c
const PROFI_tstBlock FPARM_astFblBlockTable[] = {FPARM_ast_FblBlock_Table};
const PROFI_tstPartition FPARM_astFblPartitionTable[] = {FPARM_ast_FblPartition_Table};
以上声明导致 QAC 警告。
FPARM1CA.H
#define FPARM_ast_FblBlock_Table \
0x00000000 , 0x00000000 , 0x00000000 , 0x00000000 , 0x00020000 , 0x00000000 , 0x00001000 , 0x00000000 , FPARM_nMemTypeIntFlash1 , 0x01 , 0x0000 , FPARM_bi8DataBlock | FPARM_bi8CommonBlock , 0x0000
#define FPARM_ast_FblPartition_Table \
(uint32)__ghsbegin_FLoaderIdent, (uint32)0x0, (uint32)FPARM_astFblBlockTable, (uint32) 0x0, 1, 0, 0x00, 0x00, 0x00, 0x00
Profi1c1.h
typedef struct PROFI_tstPartition
{
uint32 xAddressID;
uint32 u32Reserved1;
uint32 xBlockTableAdr;
uint32 u32Reserved2;
uint16 u16NumberOfBlocks;
uint16 u16GlobalProperties;
uint8 au8Reserved[4];
} PROFI_tstPartition;
typedef struct PROFI_tstBlock
{
uint32 xPhysicalAddress;
uint32 u32Reserved1;
uint32 xLogicalAddress;
uint32 u32Reserved2;
uint32 xBlockLength;
uint32 u32Reserved3;
uint32 xSectorSize;
uint32 u32Reserved4;
uint8 u8BlockMemoryType;
uint8 u8Security;
uint16 u16Reserved;
uint16 u16BlockProperties;
uint16 u16Reserved2;
} PROFI_tstBlock;
是否有任何类型转换或更好的方法来初始化 const 结构以避免警告?
任何具有静态存储持续时间的变量都不能从另一个变量初始化。所以如果它是一个数组,它不能包含对初始化列表中其他变量的任何引用。
不要做这样的事情:
const type1 array1 [] = {1, 2, 3};
const type2 array2 [] = {0, array1, 0}; // won't work
而是做这样的事情:
#define ARRAY1_INIT { 1, 2, 3 }
const type1 array1 [] = ARRAY1_INIT;
const type2 array2 [] = {0, ARRAY1_INIT, 0};