【问题标题】:Why can I pass an argument of incomplete type to a function? [duplicate]为什么我可以将不完整类型的参数传递给函数? [复制]
【发布时间】:2015-12-16 19:56:51
【问题描述】:

根据http://en.cppreference.com/w/cpp/language/type,未知边界的数组是不完整的类型,函数定义只允许使用完整类型的参数。

好吧,考虑下面的代码:

#include <iostream>
using namespace std;

void f(int t[])
{
    cout << t[2] << endl;
}

int main()
{
    int tab[5] = {1,2,3,4,5};
    f(tab);
}

据我了解,int t[] 是一个未知边界数组。因此函数f的定义中不能出现这种类型的参数,上面的代码应该是非法的。

然而,clang http://melpon.org/wandbox/permlink/IqOXuXBqIsJSJLOr 和 gcc http://melpon.org/wandbox/permlink/8TKWq3UTP5sNC8rJ 都接受此代码。为什么?

【问题讨论】:

  • Nitpick:您传递的是完整类型的参数。你问的是参数,而不是参数。
  • @chris 我想知道这是挑剔还是我的问题的答案...... cppreference.com 的确切引用:“以下任何上下文都需要类 T 是完整的:(。 ..) * 定义或函数调用返回类型为 T 或参数类型为 T 的函数;(...)"
  • 一个函数定义,就像你有的,要求它的参数是完整的。声明没有。实际答案是真的变成了指针,指针是完整的类型。

标签: c++ arguments incomplete-type


【解决方案1】:

调整参数类型的常用规则也适用于未知边界的数组。因此,该声明实际上使f 成为接受int* 类型参数的函数,而不是int[]int* 是一个完整的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    相关资源
    最近更新 更多