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

时间:2013-08-22 11:22:34

标签: c++ c

此问题是`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(),你的答案会改变吗?

2 个答案:

答案 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答案。它根本不安全。