繁体   English   中英

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

[英]C and defining a function prototype with no parameters

这个问题是`f(void)`的一个分支, 意味着C ++ 11或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将可靠地确保在main()调用func()将三个参数放在正确的位置(寄存器,堆栈,等等),以便func()找到它们?

问题2:

如果上面1的答案是安全的话,那么如果用C语言以外的某种语言实现func() ,你的答案是否会改变?

你在问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做。

Q1。 如果参数是正确的类型,那么MAYBE它将起作用(它可能会)。 但是尝试func(1.2, "blah"); 并看看它做了什么 - 它可以“工作”,因为它不会崩溃 - 它肯定会编译。

Q2。 见Q1答案。 它根本不安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM