我不明白为什么这段代码有效。
int f(int,int);
int main()
{
f(12,21);
return 0;
}
int f(int,int b)
{
return 0;
}
我如何在函数f(...)中使用第一个arg?
答案 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;