【发布时间】:2013-08-22 11:22:33
【问题描述】:
这个问题是`f(void)` meaning no parameters in C++11 or C?的一个分支
一些人已经回答了这个问题,并认为在 C 中,函数原型的含义
void func ()
是不是func是一个什么都不返回的函数(void),此时参数未知。
他们还认为,可以进行此声明,然后使用一些参数调用该函数,例如:
func (1, 2, 3);
所以,我做了这个,我做了一个测试来验证它是否有效,我并不感到惊讶。
这里是func.c,其中包含main()
#include <stdio.h>
extern void func ();
int main (int ac, char ** av)
{
func (1, 2, 3);
return 0;
}
这里是func1.c,其中包含函数func()
#include <stdio.h>
void func (int a, int b, int c)
{
printf ( "%d, %d, %d\n", a, b, c );
}
这是我的问题
问题 1:
当我运行这个程序时,我得到了预期的输出 1、2、3。
这是一种安全的代码编写方式吗?也就是说,可以假设 ABI 将可靠地确保在 main() 中调用 func() 会将三个参数放在正确的位置(寄存器、堆栈等),以便 func() 找到它们?
问题 2:
如果上面 1 的答案是安全的做法,那么如果 func() 是用 C 以外的其他语言实现的,你的答案会改变吗?
【问题讨论】:
-
即使它在 C 中是安全的(我会说不是,原因很明显),它在 C++ 中也是非法的。
-
@juanchopanza AFAIK 它在 C 中是安全的。
1, 2, 3是int类型的文字 - 当您调用foo(1, 2, 3)时,未知之前的原型被假定为void (int, int, int)。 -
请记住,在 C 中没有函数重载。 C 和 C++ 之间的巨大差异。
-
在
C的函数原型中使用空参数列表,正因如此,无法提供安全的 ABI。不要使用它,除非你的函数准备好接受任何类型和数字或参数。 -
@Walter 空参数列表不可用于指定变量参数。