考虑以下函数:
void func1(int unsized_array[]){}
void func2(int sized_array[10]){}
void func3(int *pointer){}
根据结果:
std::cout << std::is_same<decltype(func1), decltype(func2)>::value << std::endl;
std::cout << std::is_same<decltype(func2), decltype(func3)>::value << std::endl;
std::cout << std::is_same<decltype(func3), decltype(func1)>::value << std::endl;
这3个函数的类型是相同的。也在函数内部func2
, sizeof
运算符不提供所有组合的数组元素的大小。
那么大小数组作为函数参数的目的是什么(比如func2
)?
-
由于数组声明符通常可能具有大小表达式(例如在定义除参数之外的数组时或在声明包含数组作为子部分的参数时,例如指向数组的指针),因此需要更多的工作来排除从语法中删除它比无害地保留它要好。 (C 中有许多结构可能不会产生任何效果,例如没有副作用的语句表达式 (3*4;
)、无副作用的逗号表达式的左操作数、具有空主体的函数或循环等等。排除对语言没有影响的东西需要做很多工作。)
-
当参数中的数组大小确实改变了含义时static
存在关键字;void func2(int asd[static 10])
声明一个函数,该函数必须传递一个指向至少十个元素中的第一个元素的指针,这与其他声明的含义不同。 (这会加剧从数组参数声明的语法中排除大小表达式的问题,因为有必要禁止裸大小,但不能禁止带有static
.)
-
数组大小对于函数实现者和函数用户来说可能是有用的文档。
-
评估数组大小。例如,如果定义是void func2(int asd[printf("Hello")]) {}
,那么调用该函数时将打印“Hello”。 (有些编译器可能不会这样做;C 标准对此并不清楚。)
-
如果编译器发现函数使用的元素数量多于规定的元素数量或调用者传递的元素数量少于规定的数量,则编译器可以使用大小表达式发出警告。 (Clang 11 似乎不做前者,也不做后者,除非static
用来。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)