我正在学习C,并且正在研究函数。因此,我读到实现自己的函数时,必须在main()之前声明它。如果我错过了声明,编译器将收到错误消息。
我正在研究此示例(发现数字是否为质数),
#include <stdio.h>
void prime(); // Function prototype(declaration)
int main()
{
int num, i, flag;
num = input(); // No argument is passed to input()
for(i=2,flag=i; i<=num/2; ++i,flag=i)
{
flag = i;
if(num%i==0)
{
printf("%d is not prime\n", num);
++flag;
break;
}
}
if(flag==i)
printf("%d is prime\n", num);
return 0;
}
int input() /* Integer value is returned from input() to calling function */
{
int n;
printf("\nEnter positive enter to check: ");
scanf("%d", &n);
return n;
}
我注意到已声明函数prime(),但主要是调用了函数input(),并在底部实现了函数input()。好的,我认为这是一个错误,因此我将名称从质数更改为输入。
但是如果我删除声明,但未在其中放置任何内容,则程序将正确编译,并且运行平稳。 (我在Ubuntu上编译并运行它。)
是否有必要声明一个没有参数的void函数?
如果在使用位置之前没有函数的前向声明,则编译器将为您创建隐式声明-带有签名int input()
。它将使用您调用的函数的名称,并假定该函数正在返回int
,并且它可以接受any自变量(如注释中的Bartek所示。)>
对于此函数,隐式声明与真实声明匹配,因此您没有问题。但是,您应该对此始终保持谨慎,并且您应该始终偏向于前向声明而不是隐式声明
(无论它们是否相同)。因此,不仅要具有void prime()
函数的前向声明(假设您将在某处使用它),还应具有int input()
的前向声明。要查看如何传递任意数量的参数,请考虑以下因素:
告诉编译器不要对参数进行任何检查。#include <stdio.h> // Takes any number of the arguments int foo(); // Doesn't takes any arguments int bar(void) { printf("Hello from bar()!\n"); return 0; } int main() { // Both works // However, this will print junk as you're not pushing // Any arguments on the stack - but the compiler will assume you are foo(); // This will print 1, 2, 3 foo(1, 2, 3); // Works bar(); // Doesn't work // bar(1, 2, 3); return 0; } // Definition int foo(int i, int j, int k) { printf("%d %d %d\n", i, j, k); return 0; }
因此,在函数的定义
内,您正在描述函数参数。但是,函数的[[declaration
我的问题是,有必要声明一个没有参数的void函数吗?
是。为此,必须将void
放在函数括号中。
void foo(void);
声明类似函数
void foo();
表示可以接受任意数量的参数。
如果未使用prime,则忽略声明。该代码不会作为C ++进行编译,因为编译器会抱怨使用了函数
input
,但未声明。 C编译器可能会发出警告,但C会更放松,并且将输入隐式声明为int input()
,这意味着您可以将任何值传递给输入,并且输入返回int。使用函数之前总是提供函数声明是一种很好的样式。只有这样做,编译器才能看到传递的参数是否太少,太多或键入错误,以及如何正确处理返回值(可能是short或
char
而不是int )。