此问题是`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将可靠地确保func()
中main()
的调用将三个参数放在func()
的正确位置(寄存器,堆栈等)以找到它们?
问题2:
如果对上述1的答案是安全的话,那么如果用{C}以外的某种语言实现func()
,你的答案会改变吗?
答案 0 :(得分:11)
您是在询问C还是C ++?
C最初没有功能原型。你写的是:
extern void func();
然后定义它:
void func( a, b, c )
int a;
int b;
int c;
{
// ...
}
C ++添加了函数原型,并使上述内容非法。和 声明:
extern void func();
声明了一个没有参数的函数;用它来称呼它 参数是一个错误,就像用参数定义它一样。
然后,C从C ++中添加了函数原型。但要避免 破坏现有代码,它不需要它们,并且处理extern void func();
和以前一样:一个函数采用未知数量和类型 参数。所以它还补充说:
extern void func(void);
作为一种特殊的方式,说该功能不带任何 参数。然后C ++添加了这个特例,原因是 C兼容性。
在C ++中,一般规则就是写:
extern void func();
您使用void
表单的唯一时间是在标题中
必须与两种语言兼容。在C中,当然是这个
表格不符合您的要求,因此您必须添加void
。
(现在。根据我的理解,C已弃用旧版本
表单,以及将来的行为,就像C ++一样
这方面。)
查了一下。根据C11标准,§6.11.6:
使用带有空括号的函数声明符(不是 prototype-format参数类型声明符)是一个过时的 特征
请勿在C中执行此操作。
答案 1 :(得分:1)
Q1。如果参数是正确的类型,那么MAYBE它将起作用(它可能会)。但是试试func(1.2, "blah");
并看看它是做什么的 - 它可以“工作”,因为它不会崩溃 - 它肯定会编译。
Q2。见Q1答案。它根本不安全。