Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 作为函数参数的大小数组的用途是c和c++;?_C++_Arrays_C_Function_Arguments - Fatal编程技术网

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]){}
    。我完全忘记了