星号的含义是函数参数中数组的索引?

时间:2017-02-22 16:11:41

标签: c

当函数参数位于C中的数组索引中时,ConnectionFactory的含义是什么?

*

2 个答案:

答案 0 :(得分:11)

仅在*内使用

[]来声明函数原型。它是一种有效的语法。当您从原型中省略参数名称时,它非常有用,如下面的示例

int function(int, int [*]);

它告诉编译器第二个参数是VLA并且取决于第一个参数的值。在上面的例子中,它不值得这样做。看一个更有用的例子

int function(int, int [][*]); 

*内不使用[]的情况下,无法使用VLA作为函数原型中的参数,使用未命名的参数。

6.7.6声明者

语法

 1 declarator:
        [...]
        direct-declarator [ type-qualifier-list static assignment-expression ]
        direct-declarator [ type-qualifier-listopt * ]
        direct-declarator ( parameter-type-list )
        direct-declarator ( identifier-listopt )

答案 1 :(得分:6)

该标准的

Paragraph 6.7.6.2/1指定在类似数组的声明中:

  

除了可选的类型限定符和关键字static之外,[和]可以分隔表达式或*

(重点补充)。同一部分的Paragraph 4解释说:

  

如果大小是*而不是表达式,则数组类型是未指定大小的可变长度数组类型,只能在具有函数原型范围的声明或类型名称中使用

如果您的实现支持VLA ,那就是您所拥有的。声明该函数接受一个参数,该参数是(指向第一个元素的指针)一个未指定长度的可变长度数组。

正如@WeatherVane在评论中所观察到的那样,C2011使VLA支持可选(而在C99中它是强制性的)。对于不支持VLA的实现,代码在语法上是不正确的。

您可以通过预处理器检查VLA支持:

#if __STDC__
#if __STDC_VERSION__ == 199901L || ( __STDC_VERSION__ >= 201112L && ! __STDC_NO_VLA__ )
// VLAs are supported (or the implementation is non-conforming)
#else
// VLAs are not supported
// (unless the implementation provides VLAs as an extension, which could,
// under some circumstances, make it non-conforming)
#endif
#else
// a C89 or non-conforming implementation; no standard way to check VLA support
#endif