为什么函数原型在不需要时包含参数名称?

Loc*_*ead 10 c++ naming function-prototypes

我一直认为函数原型必须包含函数的参数及其名称.但是,我只是尝试了这个:

int add(int,int);

int main()
{
    std::cout << add(3,1) << std::endl;
}

int add(int x, int y)
{
    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

它奏效了!我甚至尝试过极端谨慎编译:

g++ -W -Wall -Werror -pedantic test.cpp
Run Code Online (Sandbox Code Playgroud)

它仍然有效.所以我的问题是,如果你不需要函数原型中的参数名,为什么它这么常见呢?这有什么用途吗?它与功能的签名有关吗?

Tho*_*mas 19

不,这些不是必需的,实际上被编译器忽略了.你甚至可以在不同的声明中给它们不同的名字; 以下是完全合法的:

int foo(int bar);
int foo(int biz);
int foo(int qux) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

将它们放入的原因是文档:

  • 如果有人读取您的头文件,他们可以一目了然地了解每个参数的用途.
  • 如果您使用花哨的IDE,它会在您开始键入函数调用时显示参数名称.
  • 像Doxygen这样的文档工具可以解析参数名称并在文档中显示它们.


Chr*_*ong 8

参数名称是完全可选的,对编译没有影响.它们可能放在那里以便更好地阅读代码.


Fre*_*Foo 5

声明中不需要参数名称。它们纯粹是文档。

您甚至不需要定义中的名称:

int f(int)
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 C++ 中编译得很好(尽管在 C 中不行)。这有时对于继承、重载、函数指针等很有用。

  • 如果定义使用该参数,则确实需要定义中的名称。 (2认同)
  • 在定义中省略未使用参数的名称通常还具有抑制编译器发出任何“未使用参数”警告的效果。 (2认同)
  • @MisterSir,在某些情况下您不想访问它,特别是我们的老朋友 iterator::operator++(int) ,其中 int 仅表明它是后递增运算符。 (2认同)