空参数列表是什么意思?

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

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

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

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

永远不要使用它。

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

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


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

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

6.11.6函数声明符

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

6.11.7函数定义

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

重点是我的:)

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

 int number() { return 5; } 

它编译得很好。

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

  #include  #include  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  int number(); int main(void) { int x =1; printf("%d",number(x)); } int number() { int x = 1; return x; } 

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

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

你想要做的是number(void)而不是main(void)。 这就是你想要的,它会将任何变量打印为整数。 如果传递char“F”int number(void)将返回数字70,intforms为“F”。 在代码中:

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

注意:

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