c - 这个结构是一个结构数组吗?

标签 c types struct declaration

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,并同时初始化该数组的每个元素,以便 outputQuantityvalueType > 字段初始化为零。

关于c - 这个结构是一个结构数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26825394/

相关文章:

c - 在Linux内核中设置socket输出端口号

c - 罗马数字转字母

c - 使用线程通过相同的结构传递数据和检索数据

c - 在c中初始化结构数组

matlab - MATLAB中如何禁止修改初始化结构体的字段?

c - 从 char 数组填充结构值

c - 使用 snprintf 在开头追加

types - 如何为角色组编写模块?

java - 确定数据类型

haskell - GADT 的 : Is there a reason why the weakest or strongest type is not chosen