【问题标题】:In C++, whether int a[] and int *a are the same for function definitions? [duplicate]在 C++ 中,int a[] 和 int *a 对于函数定义是否相同? [复制]
【发布时间】:2014-11-09 17:24:56
【问题描述】:

对于下面的函数定义,它们是否实际上都相等?如果不是,有什么区别?

void f1(int *a)
{
    //something to do;
}

void f2(int a[])
{
    //the same as function f1
}

void f3(int a[3])
{
    //the same as function f1
}

非常感谢!

【问题讨论】:

  • 是的,它们对编译器是一样的。
  • @MattMcNabb :是的,不能忽略边缘案例 ;-)
  • @MattMcNabb 它们在 C++ 中实际上是相同的。您链接的讨论适用于 C。
  • @MichaelPetch 不是 C++ 中的边缘案例。这就是我对另一个 C 问题感到困惑的根源。
  • @juanchopanza 谢谢,没想到

标签: c++


【解决方案1】:

函数签名是相同的。 您可以通过用一个名称命名所有函数来检查这一点。

void f1(int *a) {}
void f1(int a[]) {}
void f1(int a[3]) {}

你的编译器会抛出一个编译错误,比如“重新定义 void f1(int *)”。现在请注意这一点,如果您将函数重新排列如下:

void f1(int a[3]) {}
void f1(int a[]) {}
void f1(int *a) {}

您将收到关于“重新定义 void f1(int *)”而不是“void f1(int a[3])”的相同错误消息。这是因为在 C++ 中,只有一种方法可以将指针传递给数组,而看起来像数组的函数参数只是传递指针的语法简单。 另请查看:Why do C and C++ compilers allow array lengths in function signatures when they're never enforced?

【讨论】:

  • 一个脚注是,除了最左边的数组之外,它们确实对多维数组强制执行。实际上,最左边的 [] 在所有其他维度都需要完整大小的情况下不被强制执行。同样,这些尺寸必须与传递给函数的尺寸相匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
相关资源
最近更新 更多