【问题标题】:C and defining a function prototype with no parametersC和定义一个没有参数的函数原型
【发布时间】:2013-08-22 11:22:33
【问题描述】:

这个问题是`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 将可靠地确保在 main() 中调用 func() 会将三个参数放在正确的位置(寄存器、堆栈等),以便 func() 找到它们?

问题 2:

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

【问题讨论】:

  • 即使它在 C 中是安全的(我会说不是,原因很明显),它在 C++ 中也是非法的。
  • @juanchopanza AFAIK 它在 C 中是安全的。1, 2, 3int 类型的文字 - 当您调用 foo(1, 2, 3) 时,未知之前的原型被假定为 void (int, int, int)
  • 请记住,在 C 中没有函数重载。 C 和 C++ 之间的巨大差异。
  • C 的函数原型中使用空参数列表,正因如此,无法提供安全的 ABI。不要使用它,除非你的函数准备好接受任何类型和数字或参数
  • @Walter 空参数列表可用于指定变量参数。

标签: c++ c


【解决方案1】:

你问的是 C 还是 C++?

C 最初没有函数原型。你会写:

extern void func();

然后定义它:

void func( a, b, c )
    int a;
    int b;
    int c;
{
    //  ...
}

C++ 增加了函数原型,使上述内容不合法。和 声明:

extern void func();

声明了一个没有参数的函数;用它调用它 arguments 是一个错误,就像用 arguments 定义它一样。

C 然后从 C++ 添加了函数原型。但是为了避免 破坏现有代码,它不需要它们,并处理

extern void func();

和以前一样:一个函数采用未知数量和类型的 参数。所以它还补充说:

extern void func(void);

作为一种特殊的方式来表示该函数不占用任何 参数。 C++ 然后出于以下原因添加了这种特殊情况 C 兼容性。

在 C++ 中,一般规则是只写:

extern void func();

您唯一一次使用带有void 的表单是在一个标题中 必须与两种语言兼容。当然,在 C 中,这 表单不符合您的要求,因此您必须添加void。 (现在。据我了解,C 已经弃用了旧的 形式,因此在未来,它的行为可能与 C++ 中的 C++ 完全一样 尊重。)

编辑:

已经查过了。来自 C11 标准,§6.11.6:

使用带空括号的函数声明符(不是 原型格式参数类型声明符)已过时 功能。

不要在 C 中这样做。

【讨论】:

  • 引用标准是自动 +1 :)
【解决方案2】:

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

第二季度。请参阅 Q1 的答案。这一点都不安全。

【讨论】:

    猜你喜欢
    • 2014-11-22
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2012-02-04
    相关资源
    最近更新 更多