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

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

在一些实验中,似乎也会出现其他限定词:

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

似乎只有当数组被声明为函数的参数时,才允许在[]中使用限定符.这些是做什么的?为什么函数参数不同?

推荐答案

第一个声明告诉编译器someArrayat leastsomeArray个元素的长度.这可以用于优化.例如,它也意味着someArray永远不是NULL.

请注意,C标准不要求编译器在函数调用不满足这些要求时进行诊断(即,它是silent的未定义行为).

第二个声明简单地声明了someArray(不是someArray的元素!)作为常量,也就是说,您不能写someArray=someOtherArray.它与参数为char * const someArray的情况相同.

此语法仅在函数参数列表中数组声明符的最内层[]中可用;这在其他情况下是没有意义的.

涵盖上述两种情况的标准文本在C11 6.7.6.3/7中(在C99中为6.7.5.3/7):

将参数声明为"类型数组"应调整为"类型限定指针",其中类型限定符(如有)是数组类型派生的[]中指定的限定符.如果关键字static也出现在数组类型派生的[]中,那么对于函数的每次调用,对应的实际参数的值应提供对数组的第一个元素的访问,该元素至少具有相同的数量

C++相关问答推荐

了解返回函数指针的函数定义

理解没有返回语句的递归C函数的行为

你能用自己的地址声明一个C指针吗?

如何在C中只使用一个带双方括号([i][j])访问语法的malloc来分配动态大小的2d数组?

getchar读css + z还是返回css?

为什么在C中进行大量的位移位?

将数据移动到寄存器时出现分段故障

如何在ASM中访问C struct 成员

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

C I/O:在Windows控制台上处理键盘输入

我在C程序的Flex/Bison中遇到语法错误

用C++构建和使用DLL的困惑

错误:字符串在C中获得意外输出

如何摆脱-WIMPLICIT-Function-声明

程序对大输入给出错误答案

按字典顺序打印具有给定字符的所有可能字符串

与指针的原始C数组或C++向量<;向量<;双>>;

无法将字符串文字分配给 C 中的字符数组

使用fread()函数读取txt文件

Makefile - 将 .o 文件放入子文件夹中