什么是“结构”的奇怪用法的意思

时间:2016-05-09 02:33:57

标签: c++ struct

static struct option long_options[] = {
     {"help", no_argument, 0, 'h'},
     {"config",    required_argument, 0, 'c'},
     {"sampleIn",  required_argument, 0, 's'},
     {"submitDir", required_argument, 0, 'd'},
     {"numEvents", required_argument, 0, 'n'},
     {"official",  no_argument, 0, 'o'},
     {"noSubmit", no_argument, 0, 'x'},
     {0,0,0,0}
};

在我粘贴的代码中,似乎声明了一个名为“option”的结构,但我对结构名称后声明的数组感到困惑,这段代码做了什么?

感谢您的回答,请您对struct选项进行简要说明吗?它似乎已经在某个头文件中定义了一个结构。

3 个答案:

答案 0 :(得分:2)

我完全赞同@Nicol Bolas,邮政编码,而不是图片。但是,我会告诉你这意味着什么,因为这是你在SO上的第一篇文章,可能不熟悉规则(尽管你应该read the guide以及如何编写MCVE)。

您的代码定义了struct optionbrace-initializes的数组。该数组称为long_options。它的长度是在编译时确定的,在你的情况下它的长度为8.它标记为static,即它仅在当前编译单元中可见,或者,从技术上讲,它具有internal linkage (除非你在函数内定义它,否则它在函数调用中是可见的)。

PS:如果这是C ++代码(而不是C),那么您可以从定义中省略struct,只需使用

static option long_options[] = {...};

在C中,您需要使用struct作为类型的一部分。在C ++中,它是可选的。

关于你的上一次编辑:是的,之前声明了类型struct option(很可能是在头文件中),否则声明看起来像

// defines a new struct type and brace-initializes an array of that type
static struct option{...} long_options[] = {...}; 

答案 1 :(得分:0)

这只是声明并初始化这些结构的数组。

结构必须已在别处定义,所以现在创建它们的数组,并使用显示的值初始化每个元素(结构)。

答案 2 :(得分:0)

最后一个option的值都设置为0(或者,在指针的情况下,NULL)。无论处理这个数组的代码是什么,都会期望这个标记struct将用于标记数组的结尾,就像'\0'对字符串(char*)所做的一样。

从技术上讲,您可以使用sizeof(long_options) / sizeof(option)获取此数组的大小。但是如果你将它传递给期望option*的函数则不会;在那一点上,任何人都猜测阵列到底有多大。