这个结构是一组结构吗?

时间:2014-11-09 05:42:53

标签: c types struct declaration

struct SOutputQuantity
{
  TAnalogOutputQuantity outputQuantity;
  TValueType valueType;
};

static struct SOutputQuantity _outputTypeToQuantityMap[] = {

{,},
{,},

};

这是一个初学者的问题,但我试图理解代码,但无法得到它。我不能从这段代码中理解,如果这是一个结构数组,那么为什么之前有关键字struct呢?

3 个答案:

答案 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)

如果没有一些练习,C声明很难理解。在下面,我忽略了一些与指针有关的困难。网上有很多很好的参考资料,可以更详细地解释C声明是如何工作的。也就是说,这是如何理解您提供的代码的简化版本。

首先,如何声明某些类型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 SOutputQuantityoutputQuantity字段初始化为零。