小编典典

像“char s [static 10]”这样的函数的数组参数中的静态关键字的目的是什么?

all

在浏览一些源代码时,我遇到了这样的函数:

void someFunction(char someArray[static 100])
{
    // do something cool here
}

通过一些实验,似乎其他限定符也可能出现在那里:

void someFunction(char someArray[const])
{
    // do something cool here
}

似乎只有[ ]在数组被声明为函数的参数时才允许在内部使用限定符。这些有什么作用?为什么函数参数不同?


阅读 89

收藏
2022-08-24

共1个答案

小编典典

第一个声明告诉编译器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
也出现在数组类型派生的[and]中,则对于函数的每次调用,对应的实际参数的值应提供对数组的第一个元素的访问,该数组的元素至少与尺寸表达。

2022-08-24