new*_*bie 2 c c++ arrays arguments function
考虑以下函数:
void func1(int unsized_array[]){}
void func2(int sized_array[10]){}
void func3(int *pointer){}
Run Code Online (Sandbox Code Playgroud)
根据结果:
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;
Run Code Online (Sandbox Code Playgroud)
这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
被使用。)