这个问题是`f(void)`的一个分支,意味着C++ 11或C中没有参数?
有几个人回答了这个问题,并认为在C中,函数原型的意义
void func ()
Run Code Online (Sandbox Code Playgroud)
是func是一个函数返回什么(void),其参数目前是未知的.
此外,他们认为可以制作此声明,然后使用一些参数调用该函数,例如:
func (1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
所以,我做了这个,我做了一个测试,以验证这是否有效,我并不感到惊讶.
这是func.c,其中包含 main()
#include <stdio.h>
extern void func ();
int main (int ac, char ** av)
{
func (1, 2, 3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里是包含该函数的func1.c func()
#include <stdio.h>
void func (int a, int b, int c)
{
printf ( "%d, %d, %d\n", a, b, c );
}
Run Code Online (Sandbox Code Playgroud)
这是我的问题
问题1:
当我运行这个程序时,我得到了预期的输出1,2,3.这是一种安全的编写代码的方法; 即可以假设ABI将可靠地确保func()in 的调用main()将三个参数放在正确的位置(寄存器,堆栈,等等)func()以找到它们?
问题2:
如果上面1的答案是安全的话,那么如果用func()C以外的某种语言实现你的答案会改变吗?
Jam*_*nze 11
你在问C还是关于C++?
C最初没有功能原型.你写的:
extern void func();
Run Code Online (Sandbox Code Playgroud)
然后定义它:
void func( a, b, c )
int a;
int b;
int c;
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
C++添加了函数原型,并使上述内容非法.声明:
extern void func();
Run Code Online (Sandbox Code Playgroud)
声明了一个没有参数的函数; 用参数调用它是一个错误,就像用参数定义它一样.
C然后从C++添加了函数原型.但是为了避免破坏现有代码,它不需要它们并进行处理
extern void func();
Run Code Online (Sandbox Code Playgroud)
和以前一样:一个函数采用未知数量和类型的参数.所以它还补充说:
extern void func(void);
Run Code Online (Sandbox Code Playgroud)
作为一种特殊的说法,该功能不带任何参数.然后,出于C兼容性的原因,C++添加了这个特例.
在C++中,一般规则是写:
extern void func();
Run Code Online (Sandbox Code Playgroud)
您使用表单的唯一时间void是在必须与两种语言兼容的标题中.当然,在C语言中,这个表单没有你想要的,所以你必须添加void.(就目前而言.根据我的理解,C已经弃用了旧的表单,将来也可能在这方面与C++完全相同.)
看了之后.根据C11标准,§6.11.6:
使用带有空括号的函数声明符(不是prototype-format参数类型声明符)是一个过时的功能.
不要用C做.
| 归档时间: |
|
| 查看次数: |
2806 次 |
| 最近记录: |