C++ 定义一个没有参数的函数原型

C++ 定义一个没有参数的函数原型,c++,c,C++,C,这个问题是经济学的一个分支 一些人回答了这个问题,并认为在C中,函数原型的含义 void func () func是一个不返回任何内容(void)的函数,其参数目前未知 此外,他们认为可以做出此声明,然后使用以下参数调用函数: func (1, 2, 3); 所以,我做了这个,我做了一个测试来验证这个方法的有效性,我对它的有效性并不感到惊讶 这里是func.c,它包含main() 以下是我的问题 问题1: 当我运行这个程序时,我得到了预期的输出1,2,3。 这是一种安全的代码编写方式吗;i、

这个问题是经济学的一个分支

一些人回答了这个问题,并认为在C中,函数原型的含义

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();