函数参数

时间:2012-01-13 19:13:32

标签: c++ syntax

我不明白为什么这段代码有效。

int f(int,int);

int main()
{
    f(12,21);
    return 0;
}

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

我如何在函数f(...)中使用第一个arg?

6 个答案:

答案 0 :(得分:8)

参数名称不是函数签名的一部分,只有它的名称和参数的类型是。

因此,不完全合法地命名您的参数。但是,您无法使用它们。 (当然,除非你做一些黑客攻击)

有些黑客行为:注意 - 不是平台独立的,不是标准保证,而是有趣:)

void foo (int x, int, int z)
{
   int* pz = &z;
   int y = *(--pz);
   cout << x << " " << y << " " << z;
}

int main()
{
    foo(2,3,4);
    // prints "2 3 4"
}

这适用于Win7上的MSVS 2008.代码取决于如何在函数参数堆栈上推送参数。

在生产代码中,您应该为所有参数使用名称,包括在声明中,并使它们尽可能具有描述性。

答案 1 :(得分:6)

你不能。除非你给它一个名字。但是你不能在这个功能中使用任何一个。

通常,省略参数的名称以避免警告它未被使用。在f函数中,您可能会被警告b未被使用,但不是第一个参数。

答案 2 :(得分:4)

你不能使用f(...)的第一个参数。缺少的变量名称告诉编译器您明确要忽略此参数。

虽然这看起来似乎不太可用,但实际上非常多,当你必须遵循api时(例如因为虚拟方法),你的函数根本不关心它从调用者得到的一切。

简单示例:

class Painter {
public:
   virtual void paint( Object o, viewscreen * screen ) = 0;
};

class WindowPainter {
public:
   virtual void paint( Object o, viewscreen * screen ) {
   ...
   }
};

class ConsolePainter {
public:
   // The console is available as std::cout globaly
   // often the name is just put in comments, to reference the common api  
   virtual void paint( Object o, viewscreen * /* screen */) {
   ...
   }
};

答案 3 :(得分:3)

不能使用第一个参数。最初的C语言定义对这样的事情非常宽容。仅仅因为你能做到,并不意味着有任何有用的理由。

答案 4 :(得分:2)

你不能在函数中使用第一个参数而你没有。所以这段代码已经有效了。

答案 5 :(得分:2)

如果不使用它们,函数参数不需要名称。

如果你想使用第一个参数,那就给它一个名字:

int f(int a,int b)
{
    return 0;
}

您很少在函数定义中看到这一点,但它在声明中更常见。

例如,如果您正在“删除”构造函数,那么命名参数就没有意义了:

obj& operator=(const obj&) = delete;