返回信息流void f() {}
void g(int a) {}
int main()
{
f(1);
//g(1, 1); 编译不过,提示参数个数过多
return 0;
}
用的是GCC 4.2.4
想问问为啥f(1)能过,而g(1, 1)不能?
另外,假设f()不用参数就能完成相应功能,调用f(1)会引起运行时错误吗?
这是一条镜像帖。来源:北邮人论坛 / cpp / #29887同步于 2009/10/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于函数参数个数的问题
SuperBrother
2009/10/14镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
【 在 SuperBrother 的大作中提到: 】
: void f() {}
: void g(int a) {}
: int main()
: ...................
啊?f(1)会成功?
如果编译成功的话,运行应该会出错,出现堆栈不平衡的
gcc确实能编译过去...神奇
一般情况下不会错误,gcc默认使用cdecl调用约定,调用者会负责清理栈上的参数,但如果使用了stdcall,被调用的f不知道有参数要清理,而调用者又认为f会清理参数...然后就有问题了,比如:
void __attribute__((stdcall)) f (int a,int b) {
f (1,2);
}
int main()
{
f(1,2);
return 0;
}
【 在 SuperBrother (xiaohui) 的大作中提到: 】
: 标 题: 关于函数参数个数的问题
: 发信站: 北邮人论坛 (Wed Oct 14 11:29:31 2009), 站内
:
: void f() {}
: void g(int a) {}
:
: int main()
: {
: f(1);
: //g(1, 1); 编译不过,提示参数个数过多
: return 0;
: }
:
: 用的是GCC 4.2.4
: 想问问为啥f(1)能过,而g(1, 1)不能?
: 另外,假设f()不用参数就能完成相应功能,调用f(1)会引起运行时错误吗?
: --
:
【 在 sunway 的大作中提到: 】
: gcc确实能编译过去...神奇
: 一般情况下不会错误,gcc默认使用cdecl调用约定,调用者会负责清理栈上的参数,但如果使用了stdcall,被调用的f不知道有参数要清理,而调用者又认为f会清理参数...然后就有问题了,比如:
: void __attribute__((stdcall)) f (int a,int b) {
: ...................
正解
转自CU,学习了
"
引用网址:http://david.tribble.com/text/cdiffs.htm#C99-func-vararg
“
Empty parameter lists
C distinguishes between a function declared with an empty parameter list and a function declared with a parameter list consisting of only void. The former is an unprototyped function taking an unspecified number of arguments, while the latter is a prototyped function taking no arguments.
// C code
extern int foo(); // Unspecified parameters
extern int bar(void); // No parameters
void baz()
{
foo(0); // Valid C, invalid C++
foo(1, 2); // Valid C, invalid C++
bar(); // Okay in both C and C++
bar(1); // Error in both C and C++
}
C++, on the other hand, makes no distinction between the two declarations and considers them both to mean a function taking no arguments.
// C++ code
extern int xyz();
extern int xyz(void); // Same as 'xyz()' in C++,
// Different and invalid in C
For code that is intended to be compiled as either C or C++, the best solution to this problem is to always declare functions taking no parameters with an explicit void prototype. For example:
// Compiles as both C and C++
int bosho(void)
{
...
}
Empty function prototypes are a deprecated feature in C99 (as they were in C89).
【 在 SuperBrother (xiaohui) 的大作中提到: 】
: void f() {}
: void g(int a) {}
: int main()
: ...................
【 在 sunway 的大作中提到: 】
: 转自CU,学习了
: "
: 引用网址:http://david.tribble.com/text/cdiffs.htm#C99-func-vararg
: ...................
赞,这资料好,学习了学习了
原来如此,3x
【 在 sunway 的大作中提到: 】
: 转自CU,学习了
: "
: 引用网址:http://david.tribble.com/text/cdiffs.htm#C99-func-vararg
: ...................