为了账号安全,请及时绑定邮箱和手机立即绑定

static char关键字在函数数组参数中的用途如“char s [static 10]”?

static char关键字在函数数组参数中的用途如“char s [static 10]”?

C
慕标琳琳 2019-07-31 17:50:36
static char关键字在函数数组参数中的用途如“char s [static 10]”?在浏览一些源代码时,我遇到了这样的函数:void someFunction(char someArray[static 100]){     // do something cool here}通过一些实验,似乎其他限定符也可能出现在那里:void someFunction(char someArray[const]){     // do something cool here}似乎只有[ ]在将数组声明为函数的参数时才允许使用限定符。这些怎么办?为什么功能参数不同?
查看完整描述

2 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

第一个声明告诉编译器someArray长度至少为 100个元素。这可以用于优化。例如,它也意味着someArray永远不会为NULL。

请注意,C标准不要求编译器诊断何时对函数的调用不满足这些要求(即,它是静默未定义的行为)。

第二个声明只是声明someArray(不是someArray's的元素!)为const,即你不能写someArray=someOtherArray。它与参数相同char * const someArray

此语法仅[]在函数参数列表中的数组声明符的最内层中可用,在其他上下文中没有意义。

涵盖上述两种情况的标准案文载于C11 6.7.6.3/7(C99为6.7.5.3/7):

一个参数为“”类型的阵列“”的声明,应调整至“”合格指针为类型“”,其中类型限定符(如果有的话)的那些内的指定[]该阵列类型的推导。如果关键字static也出现在数组类型派生的[]中,那么对于每次对函数的调用,相应的实际参数的值应提供对数组的第一个元素的访问,其中元素的数量至少与大小表达。


查看完整回答
反对 回复 2019-07-31
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

关于这个主题:我想知道是否应该考虑使用int foo(struct bar [static 1]);而不是int foo(struct bar *);作为不接受NULL指针的函数的签名。(我知道gcc有一个替代的非标准语法来标记这样的函数,以便编译器可以发出警告..)

查看完整回答
反对 回复 2019-07-31
  • 2 回答
  • 0 关注
  • 947 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信