我希望能够轻松创建具有特定信息的 const 结构,因此决定“一次一行”声明和初始化它们,因此我可以根据需要简单地添加新的 const 结构。这工作正常,但是我如何创建某种数组来访问这些 const 结构中的每一个?我尝试了以下方法,但不起作用。
typedef struct
{
int numOfNotes;
char *arpName;
double freqRatios[12];
} ARPINFO;
const ARPINFO majorArp = {3,"Major Arpeggio",{0.0,JUST_MAJ_3,JUST_PERF_5}};
const ARPINFO minorArp = {3,"Minor Arpeggio",{0.0,JUST_MIN_3,JUST_PERF_5}};
const ARPINFO arpInfoArray[2] = {majorArp,minorArp}; // ERROR HERE
Run Code Online (Sandbox Code Playgroud)
如果我可以使用这种方式来组织我的结构,那么每次我创建一个新的 const 结构时,我只需要更改数组的大小并将新的 const 结构添加到数组中。
还是我在这里偏离了轨道?枚举或宏会帮助我吗?
编辑:freqRatios 是用宏定义的,我知道最初的 0.0 可能是多余的......
具有静态存储持续时间的变量必须在 C 中具有编译时常量初始值设定项。另一个变量不算作编译时常量(即使该变量是 const)。
你可以写:
#define MAJOR_ARP {3,"Major Arpeggio",{0.0,JUST_MAJ_3,JUST_PERF_5}}
#define MINOR_ARP {3,"Minor Arpeggio",{0.0,JUST_MIN_3,JUST_PERF_5}}
const ARPINFO majorArp = MAJOR_ARP;
const ARPINFO minorArp = MINOR_ARP;
const ARPINFO arpInfoArray[2] = { MAJOR_ARP, MINOR_ARP };
Run Code Online (Sandbox Code Playgroud)
请注意,这有两个数据副本。如果您可以拥有一份数据副本和其他引用它的静态变量,您可以改为:
const ARPINFO *const arpInfos[2] = { &majorArp, &minorArp };
Run Code Online (Sandbox Code Playgroud)
您应该描述您收到的错误。尝试自己编译它的结果是:
main.cpp:14:33: error: initializer element is not a compile-time constant
const ARPINFO arpInfoArray[2] = {majorArp,minorArp}; // ERROR HERE
^~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
解决方案是:
const ARPINFO arpInfoArray[2] = {
{3,"Major Arpeggio",{0.0,JUST_MAJ_3,JUST_PERF_5}},
{3,"Minor Arpeggio",{0.0,JUST_MIN_3,JUST_PERF_5}}
};
Run Code Online (Sandbox Code Playgroud)