struct SOutputQuantity
{
TAnalogOutputQuantity outputQuantity;
TValueType valueType;
};
static struct SOutputQuantity _outputTypeToQuantityMap[] = {
{,},
{,},
};
这是一个初学者的问题,但我试图理解代码,但无法得到它。我不能从这段代码中理解,如果这是一个结构数组,那么为什么之前有关键字struct呢?
答案 0 :(得分:0)
struct SOutputQuantity // Line 1: defines "struct SOutputQuantity"
{
TAnalogOutputQuantity outputQuantity;
TValueType valueType;
};
static struct SOutputQuantity _outputTypeToQuantityMap[] = { // Line 7: declars an array of SOutputQunantity
{,},
{,}
};
1)第1行定义了一个“结构”(一个复杂的数据记录),您可以在以后的程序中使用它。
2)您没有显示如何定义TAnalogOutputQuantity和TValueType - 它们可能位于其他地方的“typedef”中(可能在.hr头文件中)。
3)他们声明了一个名为“_outputTypeToQuantityMap”的变量。
4)“_ outputTypeToQuantityMap”是一个SOutputQuantity数组。
5)“静态”表示名称“_outputTypeToQuantityMap”仅在此模块中可见。
6)“{,}”显然是为了初始化两个元素,每个元素由outputQuantity和valueType组成。
问:代码片段甚至可以编译吗?
答案 1 :(得分:0)
即使您之前已经声明过,也可以随时声明某个结构是否为结构。它并没有对程序的输出产生影响。
答案 2 :(得分:0)
首先,如何声明某些类型a
的{{1}}个元素的数组N
?在C中,这写为
T
请注意T a[N];
是A元素的类型。无论T
是什么,都是如此。例如,
T
在每种情况下,数组元素的类型首先出现在声明中。对于结构类型,也为true。即,
int a[N];
char a[N];
声明struct foo a[N];
个a
元素的数组,每个元素都是N
。在这种情况下,与前两个示例不同,先前在源文件或其中一个包含的标题中必须有struct foo
的定义。
因此,使用示例中的类型代码
struct foo
将struct SOutputQuantity { /* ... */ };
static struct SOutputQuantity _outputTypeToQuantityMap[N];
声明为N _outputTypeToQuantityMap
个结构的数组。
非常正确,你会指出这与你展示的代码相同。您在这里遇到的最后一件事是初始化程序的概念。假设您要声明一个包含3个整数的数组,并在编译时初始化该数组。语法是
SOutputQuantity
编译器安排(不知何故,这并不重要)
int a[3] = { 1, 2, 3 };
在程序开始执行之前。接下来,当你有一个arra声明的初始化器时,你可以省去数组中的元素数,因为编译器可以解决它。所以,
a[0] == 1
a[1] == 2
a[2] == 3
与之前的声明相同。
现在,您的示例代码的最后几行可以理解为
int a[] = { 1, 2, 3 };
此代码声明并初始化一个双元素数组。唯一需要理解的部分是struct SOutputQuantity _outputTypeToQuantityMap[] = {
/* constant #1 */,
/* constant #2 */,
};
的含义。这本身就相当混乱,它是一系列快捷方式C的结果。让我们从没有数组开始(和一个更简单的结构,所以我不必输入那么多)。
{,}
上面示例的第二行声明并初始化struct foo { int a; int b; };
struct foo x = { 1, 2 };
类型的变量f
,以便
struct foo
C允许您省略从初始化程序中省略尾随结构成员,用零填充省略的值。特别是,您可以省略所有结构成员。
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
我不确定标准是否允许它,但看起来您的编译器也允许
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
字段初始化为零。