我试图了解下面的C程序,
Pair(it.chance, it.tier)
该程序可以使用gcc -Wall test进行编译。c
PS
变量l和q仅用于缩短要在SO上询问的代码。实际上,这些是使用大型muxing宏的mux值。更改为“ a”和“ b”。答案 0 :(得分:4)
这是草率的代码。它的作用是创建一个包含4个结构的数组,并仅在每个结构中初始化成员l
。好的编译器会在此警告(对于gcc使用-Wextra
),因为该结构已部分初始化。
由于q
未被显式初始化,因此它将被设置为零。这是部分初始化结构的特殊规则。
正确编写的等效代码如下:
typedef struct
{
int l;
int q;
} id_gpios_t;
id_gpios_t id_gpios[] =
{
{1,0},
{2,0},
{3,0},
{4,0},
};
(使用l
作为标识符是众所周知的坏习惯,因为在许多编辑器字体上看起来像1
。)
答案 1 :(得分:0)
此代码
struct {
int l;
int q;
} id_gpios[] = { {1},{2},{3},{4} };
定义一个由4个元素组成的数组,每个元素都用l
初始化,并使用内部花括号中的值,并且q等于0
。
答案 2 :(得分:0)
广泛地指出,这是由于初始化方法不良所致。 C11(以及更旧的标准)在Section 6.7.9: Initialization下指定了正确初始化变量的方式。
对于{initializer}是什么的法律定义,refer the standard表示
初始化程序指定存储在对象中的初始值。
在您的代码中
struct {
int l;
int q;
} id_gpios[] = { {1},{2},{3},{4} };
{ {1},{2},{3},{4} };
是初始化程序。
此处,q
未显式初始化,因此它将被初始化为0
。这是由于标准所称的“括号内的初始化不一致”。
请参见标准的“初始化”部分EXAMPLE 5
报价相同
struct { int a[3], b; } w[] = { { 1 }, 2 };
标准说
该声明是一个括号括起来的初始化定义。它定义了一个具有两个元素结构的数组:w [0] .a [0]为1和w [1] .a [0]为2;其他所有元素均为零。
因此,将您的声明/初始化更改为:
struct {
int l;
int q;
} id_gpios[] = { {1, 1},{2, 2},{3, 3},{4, 4} };
或适用于您的要求且兼容的任何东西。
此外,由于l
和q
作为变量没有意义(对我和周围的大多数其他开发人员而言),因此请将l
和q
更改为其他变量这些变量具有什么价值意义。按照这种命名约定,如果有人认真对待Code Review,即使您只是认真一点,也可以确保您不会在Code Review中失败。