c++ - 将大小数组作为函数参数的目的是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 个函数的类型是相同的。同样在函数内部func2
, sizeof
运算符不提供所有组合的数组元素的大小。
那么将大小数组作为函数参数(如func2
)的目的是什么?
解决方案
由于数组声明符通常可能具有大小表达式(如在参数中定义数组时或在声明包含数组作为子部分的参数时,例如指向数组的指针),排除它从语法而不是无害地离开它。(C 中有许多结构可能不会产生任何效果,例如没有副作用的语句表达式 (
3*4;
)、没有副作用的逗号表达式的左操作数、具有空主体的函数或循环等等. 排除那些对语言没有影响的东西需要做很多工作。)static
当关键字出现时,参数中的数组大小确实会改变含义;void func2(int asd[static 10])
声明一个函数,该函数必须传递一个指向至少十个元素中第一个元素的指针,这与其他声明的含义不同。(这会使从数组参数声明的语法中排除大小表达式的问题更加复杂,因为有必要禁止裸大小但不能禁止带有static
.)数组大小对于函数实现者和函数用户来说可能是有用的文档。
评估数组大小。例如,如果定义是
void func2(int asd[printf("Hello")]) {}
,则在调用函数时将打印“Hello”。(一些编译器可能不会这样做;C 标准对此并不清楚。)如果编译器看到函数使用的元素数量超过规定数量,或者调用者传递的元素数量少于规定数量,则编译器可以使用 size 表达式发出警告。(Clang 11 似乎不做前者,也不做后者,除非
static
被使用。)
推荐阅读
- yaml - 使用 YAML 元数据块为 pandoc 转换声明任意变量
- java - 将 int[][] 作为通用参数传递
- javascript - 可调整大小的 html 元素
- python - Django 自定义用户 --- 在管理员中编辑新的自定义用户字段
- javascript - 内容更改时动画更改 div 的大小
- javascript - Blogger 站点地图 JavaScript
- php - 使用PHP搜索mysql数据库
- amazon-s3 - 发布到公共 S3 存储桶下的文件夹
- nuget - VSTS Nuget 发布
- python - 当我们运行内部函数调用时,控制流如何跳过外部函数调用,因为它从整个代码的顶部到底部?