C++ 定义一个没有参数的函数原型
这个问题是经济学的一个分支 一些人回答了这个问题,并认为在C中,函数原型的含义C++ 定义一个没有参数的函数原型,c++,c,C++,C,这个问题是经济学的一个分支 一些人回答了这个问题,并认为在C中,函数原型的含义 void func () func是一个不返回任何内容(void)的函数,其参数目前未知 此外,他们认为可以做出此声明,然后使用以下参数调用函数: func (1, 2, 3); 所以,我做了这个,我做了一个测试来验证这个方法的有效性,我对它的有效性并不感到惊讶 这里是func.c,它包含main() 以下是我的问题 问题1: 当我运行这个程序时,我得到了预期的输出1,2,3。 这是一种安全的代码编写方式吗;i、
void func ()
func是一个不返回任何内容(void)的函数,其参数目前未知
此外,他们认为可以做出此声明,然后使用以下参数调用函数:
func (1, 2, 3);
所以,我做了这个,我做了一个测试来验证这个方法的有效性,我对它的有效性并不感到惊讶
这里是func.c,它包含main()
以下是我的问题
问题1:
当我运行这个程序时,我得到了预期的输出1,2,3。
这是一种安全的代码编写方式吗;i、 e.可以假设ABI将可靠地确保调用main()
中的func()
将把这三个参数放在正确的位置(寄存器、堆栈等),以便func()
找到它们吗
问题2:
<如果上述1的答案是安全的,那么,如果<代码>函数()/代码>在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节:
使用带空括号的函数声明符(不是
原型格式参数类型声明器)已过时
特色
不要在C中这样做。Q1。如果参数是正确的类型,那么它可能会工作(可能会)。但是试试func(1.2,“废话”)代码>,看看它能做些什么——从不会崩溃的意义上说它可能“工作”——它肯定会编译
问题2。见Q1的答案。这根本不安全即使在C中是安全的(我也不会,因为明显的原因),在C++中是非法的。@ JuangopopZaaAfk在C中是安全的。代码> 1, 2, 3代码>代码类型是<代码> int <代码> ->当调用<代码> FoO(1, 2, 3)< /C> >时,不知道原型被假定为<代码>空洞(int,int,int)。请记住,在C中没有函数重载。C和C++之间的一个很大的区别。在代码< C >代码>中使用函数原型中的空参数列表不能因此提供一个安全的ABI。除非您的函数准备接受任何类型、数字或参数,否则不要使用它。@Walter空参数列表不能用于指定变量参数。引用标准是自动的+1:)
extern void func(void);
extern void func();