C++ 作为函数参数的大小数组的用途是c和c++;?
考虑以下功能:C++ 作为函数参数的大小数组的用途是c和c++;?,c++,arrays,c,function,arguments,C++,Arrays,C,Function,Arguments,考虑以下功能: 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
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;
std::cout
由于数组声明符通常可能具有大小表达式(例如,在定义参数以外的数组时,或者在声明包含数组作为子部分的参数时,例如,指向数组的指针),因此将其从语法中排除要比将其保留在无害状态下花费更多的工作。(在C语言中,有许多结构可能导致无效,例如没有副作用的语句表达式(3*4;
)、逗号表达式的左操作数没有副作用、函数或循环体为空等等。要从语言中排除没有效果的内容需要大量的工作。)
参数中的数组大小在出现static
关键字时会改变其含义void func2(int asd[static 10])
声明一个函数,该函数必须传递指向至少十个元素中第一个元素的指针,这与其他声明的含义不同。(这将使从数组参数声明的语法中排除大小表达式的问题更加复杂,因为有必要禁止裸大小,而不是带有static
的大小)
数组大小对于函数实现者和函数用户可能是有用的文档
将计算数组大小。例如,如果定义为void func2(int asd[printf(“Hello”)]){}
,则调用函数时将打印“Hello”。(有些编译器可能不会这样做;C标准对此并不清楚。)
如果编译器看到函数使用的元素数量超过规定数量,或者调用方传递的元素数量少于规定数量,则可以使用大小表达式发出警告。(除非使用static
,否则Clang 11似乎不执行前者,也不执行后者。)
没有任何用途,因为它们都会衰减为相同的类型,正如您正确识别的那样。对于C++,这个行为是从C.</P>继承的
就像将const
添加到非引用参数和其他关键字不会对外部进行任何更改一样,它们都会导致void(int)
签名
void foo1(int a) {}
void foo2(const int a) {}
void foo3(volatile int a) {}
但是,您可以使用实际工作的东西,而不是int[10]
:
void func2(int(&asd)[10]) {}
这将只接受大小为10的int
数组。您现在还可以使用sizeof
在编译时获取数组大小,这对于int[10]
显然是不可能的。这不是c
,那么为什么要使用标签?@ DeuloSUS,但是这是C语言。C++是一种检测编译器所考虑的方法。@ DeVulUS我同意STD::ISSUE不是C,但最初我看到这种用法(大小数组作为函数参数)在C代码中所有三个变体在C和C++中是相同的。像func2
中那样声明数组大小并没有实际意义。大小可能用于文档目的。是的,作为函数参数的数组会自动衰减为指针,因此3个方案是相同的(这也是为什么在函数体中看不到大小的原因,sizeof
将返回指针的大小,而不是数组的大小)我真的不同意3
,因为这不是通用的,因此依赖此类文档很可能是错误的。@Devolus:注释也不能保证,但可能是有用的文档。辩称它们可能是错误的并不是对它们可能有用这一事实的反驳。我知道。这就是为什么我通常不注释代码,而是记录算法的原因。:)@Devolus:算法的文档也不能保证。@Devolus#3是最好的理由。谢谢你提醒我关于void func2(int(&asd)[10]){}
。我完全忘记了