为什么在具有多个参数的函数中存在无效参数?

时间:2016-04-10 12:11:25

标签: c++

我想要"使用void作为占位符(或重载消歧器)或甚至作为快捷方式,在进入特定函数之前调用具有void返回类型的函数,如下面的example

int f(void , int)
{
    return 0; 
}

void g()
{
}

int main()
{
    f(g(), 1); 
}

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

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

修改

为了解释这个问题背后的理由,我首先想到根据C遗产,void将是不完整的类型,因此不完整的类型不能作为函数参数出现,不像指针不完整的类型,因此void*共性。现在,这将解释void作为特殊情况"信号为"没有参数"但在C ++ 11之后,标准读取( 3.9 [basic.types] ):

  
      
  1. 如果是,则类型是文字类型:      
        
    • 空隙;或
    •   
    • 标量类型;要么   ....
    •   
  2.   

作为文字类型,我无法在其他地方找到任何可以从函数参数的候选类型中排除空白的基本原理,也不能等同于旧的C(在C11之前) )" void不是类型"。现在,我的搜索可能缺乏所需的深度,这是我试图在这个Q补偿的

3 个答案:

答案 0 :(得分:3)

void参数表示该函数具有 no 参数 * 。没有参数的函数有一些参数没有多大意义。

*这是继承自C(并且可能与该语言保持兼容),其中声明没有参数列表的函数是可以接受任何类型的任意数量参数的函数。在C ++中,这样的函数没有参数,无需使用void参数。

答案 1 :(得分:1)

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

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); 

应尽可能避免。

答案 2 :(得分:0)

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

#ifdef NDEBUG
    typedef DebugTracker* Foo;
#else
    typedef void Foo;
#endif

int SomeFunction(Foo foo, ...) {
    ...
}
  

我无法在其他地方找到任何可以排除函数参数候选类型的空白的理由

@juanchopanza指出了一件事,那就是C ++继承了C' f(void)意味着一个不带参数的函数。既然如此,C ++仍然可以拥有该功能,但是使得void参数的行为好像它们的默认值为nothing ...所以如果它们位于参数列表的末尾就有这样的默认值。

在语言设计领域,总是很容易想到你想到的情况,然后说“为什么不呢?”#34;。如果你看一下像libffi这样的东西,那么似乎禁止参数的空白会使系统变得更少"纯粹"。每个参数都有一个字节数,允许0有多难?

但有些问题需要回答。

如果可以使用void参数,则表明存在void变量。 void变量如何起作用?它的地址是什么?如果你不能获取void变量的地址,那么它如何影响编译器...链接器......用名称修改等会发生什么呢?

我不知道是否足够告诉你现有的C和C ++标准的椒盐卷饼是否可以以无效参数比损害更好的方式解开。这将是一个有趣的研究,采取编译器和一些大量的代码并仔细思考细节。我赞成这个问题是合理的,但也投票决定以主要基于意见的方式结束,所以...那是我的0.02。