为什么 void 参数不能存在于具有多个参数的函数中?
Why can't void parameters exist in functions with more than one argument?
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]):
- 如果类型是:
- 空洞;或
- 标量类型;或
作为一个文字类型,我在其他地方找不到任何将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。
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类