我目前正在阅读的书中指出,当你在c中声明一个不接受任何参数的函数,但你没有使用关键字void时,函数调用可以通过任何 它想要的论据“。所以我尝试了这个。
int number();
int main(void)
{
int x =1;
printf("%d",number(x));
}
int number()
{
return x;
}
但它没有编译???这是怎么回事?
答案 0 :(得分:9)
这是几十年前C标准化之前的一个过时的特征 1 。
永远不要使用它。
在古代C中,你出生前十年,你可以声明一个没有参数的函数。当您调用它时,编译器会将参数提升为默认类型并将它们传递给函数。本质上,编译器从调用中的参数中找出参数声明。
该函数仍应使用参数定义,并且它们应与调用函数的方式相匹配。
1 “功能”是错误的词。这是事情在当时完成的方式,因为尚未广泛开发更好的方法。在一种新的编程语言中,这种特性被认为是一种缺陷。
答案 1 :(得分:5)
为了支持Eric Postpischil的回答,我想引用C11标准( 6.11未来语言方向)
6.11.6函数声明符
使用带空括号的函数声明符(不是 prototype-format参数类型声明符)是一个过时的 特征
和
6.11.7功能定义
使用带有单独参数标识符的函数定义 声明列表(不是prototype-format参数类型和标识符 声明者)是一个过时的功能。
重点是我的:)
答案 2 :(得分:1)
这里的问题是你的功能号码不知道x。
也就是说,当你有函数号return x时,它没有返回的任何x,所以这是一个编译错误。相反,如果你写了:
int number() {
return 5;
}
它编译得很好。
答案 3 :(得分: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;
}
它可以编译和工作。当您在C中声明int number ();
时,您的意思是此函数可以被赋予非特殊类型。但是,你不能使用它。
答案 4 :(得分:-2)
我找到答案后编辑了整个答案。
你想要做的是数字(无效)而非主要(无效)。这就是你想要的,它会将任何变量打印为整数。如果传递char“F”int number(void)将返回数字70,int形式为“F”。在代码中:
int number(void e);
void main(){
char C = 'F';
printf("%d",number(C));
};
int number(void e){
return e;
};
注意:
如果你想要一个超出范围的变量,你必须总是传递一个参数。