我对'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 option
,static
。
所以gLongOption
是一个结构选项数组,并且static
.
当我们嵌入括号时,这个简单的方法会稍微分解一下,因此我们必须使用优先级规则,您应该稍后再看。
{"port", arg, NULL, 'p'}
等只是初始化结构的一种方式,元素按顺序给出。