struct SOutputQuantity
{
TAnalogOutputQuantity outputQuantity;
TValueType valueType;
};
static struct SOutputQuantity _outputTypeToQuantityMap[] = {
{,},
{,},
};
这是一个初学者的问题,但我试图理解代码但无法理解。我从这段代码中不明白的是,如果这是一个结构数组,那么为什么它前面有关键字 struct ?
最佳答案
如果不进行一些练习,C 声明可能很难理解。在下文中,我将忽略与指针有关的一些困难。网上有很多很好的引用资料,更详细地解释了 C 声明的工作原理。也就是说,这是如何理解您提供的代码的简化版本。
首先,如何声明一个由 T
类型的 N
个元素组成的数组 a
?在 C 语言中,这写为
T a[N];
请注意,T
是 A 元素的类型。无论 T
是什么,这都是正确的。例如,
int a[N];
char a[N];
在每种情况下,数组元素的类型首先出现在声明中。对于结构类型来说也是如此。即,
struct foo a[N];
声明一个由 N
个元素组成的数组 a
,每个元素都是一个 struct foo
。在这种情况下,与前两个示例不同,源文件或包含的 header 之一之前的某个位置必须有 struct foo
的定义。
因此,使用示例中的类型、代码
struct SOutputQuantity { /* ... */ };
static struct SOutputQuantity _outputTypeToQuantityMap[N];
声明_outputTypeToQuantityMap
为N个SOutputQuantity
结构的数组。
非常正确的是,您会指出这与您展示的代码不同。您在这里遇到的最后一件事是初始化程序的概念。假设您要声明一个包含 3 个整数的数组,并在编译时初始化该数组。语法是
int a[3] = { 1, 2, 3 };
编译器会安排(不知何故,这并不重要)
a[0] == 1
a[1] == 2
a[2] == 3
在程序开始执行之前。接下来,当您有 arra 声明的初始值设定项时,您可以省略数组中的元素数量,因为编译器可以计算出它。所以,
int a[] = { 1, 2, 3 };
与之前的声明相同。
现在,示例代码的最后几行可以理解为
struct SOutputQuantity _outputTypeToQuantityMap[] = {
/* constant #1 */,
/* constant #2 */,
};
此代码声明并初始化一个二元素数组。唯一需要理解的部分是 {,}
的含义。这本身就相当令人困惑,它是 C 提供的一系列快捷方式的结果。让我们从不使用数组(以及更简单的结构,因此我不必输入太多内容)开始。
struct foo { int a; int b; };
struct foo x = { 1, 2 };
上面示例的第二行声明并初始化了 struct foo
类型的变量 f
,以便
x.a == 1
x.b == 2
C 允许您从初始化器中省略尾随结构成员,并用零填充省略的值。特别是,您可以省略所有结构成员。
struct foo x = { 1 }; // x.a == 1; x.b == 0
struct foo x = { }; // x.a == 0; x.b == 0
最后,C 允许您在最后一个初始化程序之后包含尾随逗号:
struct foo x = { 1, 2, }; // x.a == 1; x.b == 2
struct foo x = { 1, }; // x.a == 1; x.b == 0
我不确定标准是否允许,但您的编译器似乎也允许
struct foo x = { , }; // x.a == 0; x.b == 0
所以,毕竟,
static struct SOutputQuantity _outputTypeToQuantityMap[] = {
{,},
{,},
};
声明一个 2 元素数组,其中每个元素的类型为 struct SOutputQuantity
,并同时初始化该数组的每个元素,以便 outputQuantity
和 valueType
> 字段初始化为零。
关于c - 这个结构是一个结构数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26825394/