首页 > 解决方案 > 将大小数组作为函数参数的目的是c和c++?

问题描述

考虑以下函数:

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 个函数的类型是相同的。同样在函数内部func2sizeof运算符不提供所有组合的数组元素的大小。

那么将大小数组作为函数参数(如func2)的目的是什么?

标签: c++arraysfunctionarguments

解决方案


  1. 由于数组声明符通常可能具有大小表达式(如在参数中定义数组时或在声明包含数组作为子部分的参数时,例如指向数组的指针),排除它从语法而不是无害地离开它。(C 中有许多结构可能不会产生任何效果,例如没有副作用的语句表达式 ( 3*4;)、没有副作用的逗号表达式的左操作数、具有空主体的函数或循环等等. 排除那些对语言没有影响的东西需要做很多工作。)

  2. static当关键字出现时,参数中的数组大小确实会改变含义;void func2(int asd[static 10])声明一个函数,该函数必须传递一个指向至少十个元素中第一个元素的指针,这与其他声明的含义不同。(这会使从数组参数声明的语法中排除大小表达式的问题更加复杂,因为有必要禁止裸大小但不能禁止带有static.)

  3. 数组大小对于函数实现者和函数用户来说可能是有用的文档。

  4. 评估数组大小。例如,如果定义是void func2(int asd[printf("Hello")]) {},则在调用函数时将打印“Hello”。(一些编译器可能不会这样做;C 标准对此并不清楚。)

  5. 如果编译器看到函数使用的元素数量超过规定数量,或者调用者传递的元素数量少于规定数量,则编译器可以使用 size 表达式发出警告。(Clang 11 似乎不做前者,也不做后者,除非static被使用。)


推荐阅读