【问题标题】:C function declarationC 函数声明
【发布时间】:2010-03-03 04:21:46
【问题描述】:

我们可以通过以下方式在头文件中声明函数吗?

extern int ap( char[][] );

我们可以在函数中使用 char[][] 吗?

【问题讨论】:

  • 你为什么不试试看。
  • @darren:“尝试”很少是测试语言结构有效性的正确方法。那里有足够多的“它在 GCC 中有效”的受害者(例如)。

标签: c function


【解决方案1】:

不,您需要指定数组的最后 N-1 个维度。

extern int ap( char[][DIMENSION] );

更多信息请看here

【讨论】:

    【解决方案2】:

    对于二维数组,您必须提供最后一维的大小,否则编译器不知道如何使用它。 (虽然可以省略名称。)

    像这样:

    extern int ap( char[][10] );
    

    【讨论】:

      【解决方案3】:

      char[][] 不是有效的数组类型,因为您不能有不完整类型的数组,并且char[] 是不完整的。我知道这很令人困惑,因为您确实有两种数组类型,所以这是另一个具有相同问题的示例:char a[3][]。数组 a 的长度为 3,元素类型为 char[],但 char[] 还是不完整的,这是 invalid

      当你有一个“多维数组”时,你真的有一个数组数组。例如,typedef int U[3][5]; 使 U 成为长度为 3 的数组,其中长度为 5 的整数数组,等效于typedef int H[5]; typedef H U[3];

      函数参数可以省略最左边维度的原因是,只有函数参数T[N] 形式的数组类型被转换为T*N 可以省略,将T[] 赋予T*。这仅适用于“最顶层”或“最外层”。

      所以,所有这些函数声明都是相同的:

      int f1(int a[3][5]);
      int f2(int a[][5]);
      int f3(int (*a)[5]);
      typedef int T[5];
      int f4(T a[3]);
      int f5(T a[]);
      int f6(T* a);
      

      当然,您可以删除上述任何声明中的参数名称​​a,而无需更改它们。

      【讨论】:

        【解决方案4】:

        然而,在函数声明中省略参数名称是完全有效的。但是,当你定义函数时,你必须给数组一个名字,然后你可以通过这个名字来引用它。

        【讨论】:

          【解决方案5】:

          不,这是不允许的 - 它试图将参数声明为指向不完整数组类型的指针。

          数组类型必须用大小来完成,像这样:

          extern int ap( char[][10] );
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-02
            • 2012-07-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多