在C中声明一个void函数

问题描述 投票:2回答:3

我正在学习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函数?

c function declare
3个回答
4
投票

如果在使用位置之前没有函数的前向声明,则编译器将为您创建隐式声明-带有签名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
告诉编译器不要对参数进行任何检查。
不声明原型而是依靠默认参数/返回类型升级是危险的,并且是旧C的一部分。在C99及以后的版本中[[在不先提供函数声明或定义的情况下调用函数是非法的

我的问题是,有必要声明一个没有参数的void函数吗?

是。为此,必须将void放在函数括号中。

void foo(void);

声明类似函数

void foo();  

表示可以接受任意数量的参数。

如果未使用
prime
,则忽略声明。

该代码不会作为C ++进行编译,因为编译器会抱怨使用了函数input,但未声明。 C编译器可能会发出警告,但C会更放松,并且将输入隐式声明为int input(),这意味着您可以将任何值传递给输入,并且输入返回int

使用函数之前总是提供函数声明是一种很好的样式。只有这样做,编译器才能看到传递的参数是否太少,太多或键入错误,以及如何正确处理返回值(可能是short

char

而不是int )。

1
投票
不声明原型而是依靠默认参数/返回类型升级是危险的,并且是旧C的一部分。在C99及以后的版本中[[在不先提供函数声明或定义的情况下调用函数是非法的

0
投票
prime
© www.soinside.com 2019 - 2024. All rights reserved.