代码之家  ›  专栏  ›  技术社区  ›  Andrew Tomazos

t“衰减”到指向t的指针数组的函数参数?[副本]

  •  0
  • Andrew Tomazos  · 技术社区  · 6 年前

    如果我有一个函数…

    void f(int x[3]) {}
    

    …这和函数有区别吗…

    void f(int* x) {}
    

    如果没有,在标准中它在哪里解决这个问题?

    很明显,有数组到指针的标准转换,但我认为它们不适用于这里?

    我似乎记得说这种话的语言,但似乎找不到。

    $ cat t.cc
    void f(int x[3]) {}
    
    void f(int* x) {}
    
    $ g++ t.cc
    t.cc: In function ‘void f(int*)’:
    t.cc:3:6: error: redefinition of ‘void f(int*)’
     void f(int* x) {}
          ^
    t.cc:1:6: note: ‘void f(int*)’ previously defined here
     void f(int x[3]) {}
          ^
    
    3 回复  |  直到 6 年前
        1
  •  4
  •   eerorika    6 年前

    如果我有一个函数…

    void f(int x[3]) {}
    

    …这和函数有区别吗…

    void f(int* x) {}
    

    不。这些声明是等效的。

    标准草案:

    【DCL.FCT】

    函数的类型使用以下规则确定。每个参数的类型(包括 函数参数包)由它自己的decl说明符seq和声明符确定。确定后 将每个参数的类型、T_或T型函数的__数组的任何参数调整为 _156;指向T__的指针。…

    这个规则补充了数组衰减规则。数组衰减允许调用带有-显然-数组参数的函数,而此规则允许声明带有-显然-数组参数的函数,而实际上传递的是指针。这些规则源于C语言的传统。与指针衰减的函数相同。

        2
  •  3
  •   Quentin    6 年前

    [dcl.fct§5] (重点是我的):

    函数的类型使用以下规则确定。 每个参数(包括函数参数包)的类型由其自身决定。 decl说明符seq 声明符 . 在确定每个参数的类型之后,任何类型的参数 T _或功能类型 T 调整为__指针 T 艾斯 .

        3
  •  2
  •   StoryTeller - Unslander Monica    6 年前

    它在函数声明器规范中进行了描述

    [DCL,FCT]

    5 […]确定每个参数的类型后,任何参数 _类型t_或功能类型t的数组调整为_指针指向 T.[…]