【问题标题】:Function declaration before and after main()main() 前后的函数声明
【发布时间】:2019-09-22 20:14:27
【问题描述】:
#include <stdio.h>

int add2nums( int, int);

void main(void)
{
  int y,a,b;

  printf("Enter 2 numbers\n");
  scanf("%d%d", &a, &b);

  y = add2nums(a,b);

  printf("a is %d\n", a);
  printf("b is %d\n", b);
  printf("y is %d\n", y);
}


int add2nums( int num1, int num2)
{
  int sum;
  sum = num1 + num2;
  return(sum);
}

通常,当我在 C 中创建新函数时,函数的定义是在 main() 函数之前创建的。

在我的讲座中,有一个如何创建函数原型的示例,以及如何通过在 main() 函数之前声明它,然后在 main() 函数结束之后定义它来创建它们。 运行上面的程序,出现如下错误:

第 5 行:警告:'main' 的返回类型不是 'int' [-Wmain]|

发生了什么?为什么add2nums()函数的声明在main()之前出现了两次,并且没有参数?

int add2nums( int, int);

然后在main() 结束后再次使用参数num1num2

int add2nums( int num1, int num2)

【问题讨论】:

    标签: c function declaration


    【解决方案1】:
    1. 在 C 语言中,main 函数具有签名 int main(),它允许您将值返回给操作系统,但您创建的 main() 没有 void 返回类型。因此,您收到了警告。
    2. int add2nums( int, int); 只是函数的声明,它允许编译器引用该函数。那是因为编译器只读取文件一次。
    3. 参数名称不是必需的,因为它们不是签名的一部分。

    【讨论】:

    • 声明是程序员告诉编译器将定义什么样的函数的一种方式。定义包括函数体(带有源代码)。这是 C 特有的事情,因为编译器从上到下读取您的代码一次,而不是两次来确定源代码中的函数。
    • main 的正确现代标准声明是 int main(void)int main(int argc, char *argv[]),或等效的,而不是 int main(),尽管 C 实现可能允许这样做。
    【解决方案2】:

    函数的声明是编译器的信息(不是链接器作为另一个答案状态) - 函数的参数是什么类型以及返回值是什么类型。

    所以不需要参数的名称。

    【讨论】:

    • 与函数定义相反,函数声明中不需要参数的名称。
    • @machine_1 如果你读了第一句话就很合乎逻辑。
    【解决方案3】:

    main() 函数有两个有效签名:

    int main( void )
    int main( int argc, char *argv[] )
    

    请注意,两个有效签名的返回类型均为int。任何其他返回类型,例如 void 均无效,并导致编译器输出警告消息。

    当代码调用一个函数时,编译器需要知道被调用函数的签名。有两种方法可以告诉编译器被调用函数的签名是什么:

    1. 在调用位置之前列出整个函数
    2. 在调用函数之前有一个函数签名的原型(又名前向引用)。在原型中,编​​译器只需要返回的类型和参数的类型。不过,在原型中列出参数的名称是一种很好的编程习惯,作为对阅读代码的人的礼貌。

    【讨论】:

    • C 标准为main 指定了两种标准的声明形式。在大多数情况下,大多数程序员通常应该使用这些。但它不会使其他情况无效——C 实现可以定义其他形式。它们只是没有被 C 标准定义,不是无效的。
    • 您好,感谢您的回答。所以为了解决这个问题,我改为:void main() 现在是 int main(),我在 int main() 的末尾放置了一个 return(0)。这没有问题。所以我认为 int main() 函数现在返回 int 类型的原因是因为调用了返回 int 的 add2nums,或者因为它保存在 int 类型的变量中,即 y?是哪一个?
    • @Aragorn90th :不,警告与调用add2nums() 完全无关。即使main() 为空,您也会收到该警告。这是一个警告而不是错误,因为 ISO C90 至少允许实现定义了 main 的形式。但是为了严格的可移植性,它应该被避免,并且在 C++ 中无论如何都是被禁止的。
    猜你喜欢
    • 1970-01-01
    • 2014-02-25
    • 2020-04-07
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2015-04-13
    相关资源
    最近更新 更多