'C'编程 - 晦涩的结构语法 - 几乎看起来像一个 python 字典 - 这是什么?



我对'C'相当陌生,遇到了一个让我完全困惑的表达。

static struct option gLongOption[] = {
{"port", arg, NULL, 'p'},
{"maxqueue", arg, NULL, 'q'},
{"help", non_arg, NULL, 'h'},
{NULL, 0, NULL, 0}}

这是怎麽? 为什么数组被声明为结构?为什么数组结构被分配(看起来像(其他结构?这是 C 语言中的标准做法吗,它有一个名字,我可以去阅读吗?这是创建"字典"结构的"C"方式吗?我知道的两件事是,上面与 argv 中发现的命令行参数有关,旨在作为客户端\服务器模型的输入;否则,我彻底糊涂了。感谢您的帮助。

gLongOption是一个结构数组。 C 允许像这样初始化数组:

int array[] = {1, 2, 3}:

更进一步,在最近的 C 方言中,您甚至可以稍后通过以下方式更改数组内容:

int array = {0};
...
array = (int[]) {1, 2, 3};

同样,您可以像这样初始化结构:

struct my_struct_t {
int i;
char c;
};
struct my_struct_t m = {1, 'a'};

现在gLongOption是一个结构数组,因此

static struct option gLongOption[] =
{ 
{"port", arg, NULL, 'p'},   // initialize  gLongOption[0] as a struct of type struct option 
{"maxqueue", arg, NULL, 'q'},  // initialize gLongOption[1]
{"help", non_arg, NULL, 'h'},  // etc.
{NULL, 0, NULL, 0}
};

初始化一个数组,其元素恰好是结构体,因此元素被初始化为结构体。

为了完整起见,您还可以使用结构的元素名称为整个结构分配一个新值,例如

m = (struct my_struct_t){
.i = 2,  // note the dot. The comma could be ommitted
};

然后,所有未显式初始化的元素都用零初始化,从而在上述赋值之后m.c == ''

它与python字典完全不同,它使用键上的哈希算法来查找值,这只是一个结构数组(而不是声明为结构的数组(。

看起来它来自GNUgetopt_long,您应该阅读文档以了解字段。这绝不是罕见的。

static struct option gLongOption[] 

要阅读此声明,您可以使用规则,"向右看,继续看,然后向左看"。

首先找到变量名gLongOption,然后向右看。 当我们看到[]时,我们说"数组"。 所以gLongOption是一系列.....

右边没有别的,所以向左看,struct optionstatic

所以gLongOption是一个结构选项数组,并且static.

当我们嵌入括号时,这个简单的方法会稍微分解一下,因此我们必须使用优先级规则,您应该稍后再看。

{"port", arg, NULL, 'p'}等只是初始化结构的一种方式,元素按顺序给出。

最新更新