5

这个问题是`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.cfunc()

#include <stdio.h>

void func (int a, int b, int c)
{
  printf ( "%d, %d, %d\n", a, b, c );
}

这是我的问题

问题一:

当我运行这个程序时,我得到了预期的输出 1、2、3。这是一种安全的代码编写方式吗?即,可以假设 ABI 将可靠地确保func()in的调用main()将三个参数放在正确的位置(寄存器、堆栈等)func()以找到它们吗?

问题2:

如果上面 1 的答案是这样做是安全的,那么如果func()用 C 以外的其他语言实现,你的答案会改变吗?

4

2 回答 2

12

你问的是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:

使用带空括号的函数声明符(不是原型格式参数类型声明符)是一个过时的特性。

不要在 C 中这样做。

于 2013-08-22T11:30:41.980 回答
1

Q1。如果参数是正确的类型,那么它可能会起作用(它可能会)。但是试着func(1.2, "blah");看看它做了什么——它可能在它不会崩溃的意义上“工作”——它肯定会编译。

Q2。请参阅 Q1 的答案。这一点都不安全。

于 2013-08-22T11:33:08.587 回答