8

我目前正在阅读的书指出,当您在 c 中声明一个不接受任何参数的函数时,但您不使用关键字 void “函数调用可以传递它想要的任何参数”。所以我尝试了这个。

int number();

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

int number()
{
    return x;
}

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

4

5 回答 5

12

这是几十年前 C 标准化之前的一个过时功能1 。

永远不要使用它。

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

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


1 “特征”是错误的词。这是当时做事的方式,因为尚未广泛开发更好的方式。在一种新的编程语言中,这个特性会被认为是一个缺陷。

于 2013-08-11T00:56:44.243 回答
6

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

6.11.6 函数声明器

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

6.11.7 函数定义

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

重点是我的:)

于 2013-08-11T03:25:06.443 回答
1

这里的问题是您的函数号不知道 x。
也就是说,当你有函数号返回 x 时,它在范围内没有任何 x 要返回,所以这是一个编译错误。相反,如果您写道:

int number() {
    return 5;
}

它会编译得很好。

于 2013-08-10T23:51:46.470 回答
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;
  }

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

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

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

  int number()
  {
     int x = 1;
     return x;
  }

它可以编译和工作。当你int number ();在 C 中声明时,你的意思是这个函数可以被赋予非特殊类型。但是,您不能使用它。

于 2013-08-10T23:50:11.037 回答
-2

好吧,我在找到答案后编辑了整个答案。

你想要做的是数字(无效)而不是主要(无效)。这就是你想要的,它会将任何变量打印为整数。如果您传递 char "F" int number(void) 将返回数字 70,即 "F" 的 int 形式。在代码中:

int number(void e);

void main(){
    char C = 'F';
    printf("%d",number(C));
};

int number(void e){
    return e;
};

笔记:

如果您想要一个超出范围的变量,您必须始终传递一个参数。

于 2013-08-11T00:04:35.573 回答