空参数列表是什么意思?

Fut*_*Sci 7 c parameters arguments

我正在阅读的这本书指出,当你在c中声明一个不接受任何参数的函数,但是你不使用关键字void"函数调用可以传递它想要的任何参数".所以我尝试了这个.

int number();

int main(void)
{
    int x =1;
    printf("%d",number(x));
}

int number()
{
    return x;
}
Run Code Online (Sandbox Code Playgroud)

但它没有编译??? 这是如何运作的?

Eri*_*hil 10

这是几十年前C标准化之前的过时特征1.

永远不要使用它.

在古代C中,你出生前十年,你可以声明一个没有参数的函数.当您调用它时,编译器会将参数提升为默认类型并将它们传递给函数.本质上,编译器从调用中的参数中找出参数声明.

该函数仍应使用参数定义,它们应与调用函数的方式相匹配.


1 "功能"是错误的单词.这是事情在当时完成的方式,因为尚未广泛开发更好的方法.在一种新的编程语言中,这种特性被认为是一种缺陷.


0de*_*al0 5

为了支持Eric Postpischil的回答,我想引用C11标准(6.11未来语言方向)

6.11.6函数声明符

使用带有空括号的函数声明符(不是prototype-format参数类型声明符)是一个过时的功能.

6.11.7函数定义

使用具有单独的参数标识符和声明列表(而不是原型格式参数类型和标识符声明符)的函数定义是一个过时的功能.

重点是我的:)


Lid*_*Guo 0

好吧,如果你想无限制地向它传递一些东西,你可能需要一个可变参数列表。这是一个例子:

  #include <stdio.h>
  #include <stdarg.h>
  int number(int , ... );

  int main(void)
  {
       int x =1;
       printf("%d",number(1,x));
  }
  int number(int n, ... )
  {
          va_list         ap;
          va_start(ap,n);
          int x = va_arg(ap,int);
          va_end(ap);
          return x;
  }
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想传递 x 但不使用它。

 #include <stdio.h>
  int number();

  int main(void)
  {
      int x =1;
      printf("%d",number(x));
  }

  int number()
  {
     int x = 1;
     return x;
  }
Run Code Online (Sandbox Code Playgroud)

它可以编译并运行。当您在 C 中声明时int number ();,您的意思是可以为该函数指定非特殊类型。但是,您不能使用它。