为什么 void 参数不能存在于具有多个参数的函数中?

Why can't void parameters exist in functions with more than one argument?

本文关键字:参数 函数 void 不能 存在 于具 为什么      更新时间:2023-10-16

I"希望"将void用作占位符(或重载消歧器),甚至用作快捷方式,以便在输入特定函数之前调用具有void返回类型的函数,如以下示例所示:

int f(void , int)
{
    return 0; 
}
void g()
{
}
int main()
{
    f(g(), 1); 
}

现在,这不是一个现实世界中的问题(我知道我可以在调用f()之前调用g()),但我想知道为什么这是不可行的,尤其是当我可以显式返回void类型时,即这是合法的:

void h()
{
    return g(); // this does a return void
}

编辑

为了解释提出这个问题的理由,我首先认为,根据C遗留,void将是一个不完整类型,因此不完整类型不能作为函数参数出现,这与指向不完整类型的指针以及void*的公共性不同。现在,这将解释void是"无参数"的"特殊情况"信号,但在C++11之后,标准读取(3.9[basic.types]):

  1. 如果类型是:
    • 空洞;或
    • 标量类型;或

作为一个文字类型,我在其他地方找不到任何将void从函数参数的候选类型中排除的理由,也找不到旧C(C11之前)的等价物"void不是类型"。现在,我的搜索可能缺少所需的深度,这正是我在这个Q 中试图弥补的。

void参数表示函数没有参数*。对于一个没有参数的函数来说,有一些参数是没有意义的。


*这是从C继承的(可能是为了与该语言兼容而保留的),在C中,声明的没有参数列表的函数是一个可以接受任何类型的任何数量的参数的函数。在C++中,这样的函数将没有参数,从而不需要使用void参数

这里唯一真正的问题是您的函数原型:

int f(void,int)

不能将void作为参数。您可以将其设置为返回值,意思是"此函数不返回任何内容",也可以将其作为唯一的参数,如下所示:

int f(void)

这意味着"此函数不接受任何参数",但不作为参数。

但是,给定void类型的参数意味着您可以声明一个void变量并将其提供给您的函数,这将毫无意义。

在您的样品中:

void h()
{
    return g(); // this does a return void
}

这不会产生返回无效。这不会带来任何回报。这与一样合法

void h()
{
    return;
}

所以在这里,你可以清楚地看到void只是一个没有意义的东西。

尝试使用返回void的函数作为参数,就像您所做的那样:

f(g(), 1); 

应尽可能避免。

我想要一个void参数类型,以便在发布版本中有一个零成本的参数:

#ifdef NDEBUG
    typedef DebugTracker* Foo;
#else
    typedef void Foo;
#endif
int SomeFunction(Foo foo, ...) {
    ...
}

我在其他地方找不到任何将void从函数参数的候选类型中排除的理由

@juancapanza指出了一件事,那就是C++继承了C的f(void),这意味着一个不带参数的函数。即便如此,C++仍然可以具有该功能,但会使void参数的默认值为none。。。因此,如果它们位于参数列表的末尾,则会有这样的默认值。

在语言设计领域,总是很容易想到你脑海中的案例,并说"为什么不呢?"。如果你看看像libffi这样的东西,那么禁止论点无效似乎会让系统变得不那么"纯粹"。每个参数都有一个字节数,允许0有多难?

但也有一些问题需要回答。

如果void参数是可能的,那么这就假定了void变量的存在。无效变量是如何作用的?它的地址是什么?如果你不能获取void变量的地址,这会对编译器产生什么影响。。。链接器。。。名称篡改等会发生什么?

我不知道现有的C和C++标准的椒盐卷饼是否可以以一种无效参数弊大于利的方式解开。这将是一个有趣的研究采取一个编译器和一些大的代码体并仔细考虑细节。我支持这个问题,认为它是合理的,但也投票认为它主要是基于意见的,所以……这是我的0.02。