为什么C有函数声明?
来自 C in a Nutshell 的示例:
//circle.c: Calculate and print the areas of circles
#include <stdio.h>
double circularArea( double r );
int main()
{
double radius = 1.0, area = 0.0;
printf( " Areas of Circle\n\n" );
printf( " radius Area\n"
"-------------------------\n" );
area = circularArea( radius );
printf( "%10.1f %10.2f\n", radius, area );
radius = 5.0;
area = circularArea( radius );
printf( "%10.1f %10.2f\n", radius, area );
return 0;
}
double circularArea( double r )
{
const double pi = 3.14159265;
return pi * r * r;
}
键入&#34; double circularArea(double r)的目的是什么;&#34;在5号线?
答案 0 :(得分:4)
C编译器从上到下处理源文件。当遇到函数的使用时,它需要知道函数的参数和返回类型。您必须在使用之前声明或定义该函数,因此它知道这些类型。
因此,您可以将curcularArea
的定义移至main()
之前,也可以在main()
之前发出声明。
一种常见的方式是将所有函数的声明放在文件的开头。然后,您可以按任何顺序定义所有函数,而不必担心哪些调用将所有依赖项放在首位。此外,如果你有相互递归的函数,定义的顺序不起作用,你需要声明其中一个。
答案 1 :(得分:1)
编译器从top
转到bottom
!因此,如果您在此function
main
not declared
中呼叫undefined
,那么declaration
!所以这个错误似乎没有出现在top
上{{1}}说编译器嘿这个函数出现在main之后,但它就在那里!
答案 2 :(得分:0)
编译器逐行进行。如果没有声明,当编译器在circularArea
函数中遇到使用main()
时,它就不知道这是什么错误。该声明基本上是对编译器的承诺,您将在稍后定义具有该签名的函数。
答案 3 :(得分:0)
C本质上是单遍的,这意味着在编译器知道之前你不能使用符号(变量,宏,函数)。
声明使编译器知道符号,并在转换单元(文件)中使用。
这些声明收集在头文件中,以避免重写它们时出错,并便于重复使用和单独编译。
在第一个使用点之前引入了带有声明的局部符号,以允许在多个符号之间进行递归引用 这些声明称为前向声明。
虽然可以不需要使用前向声明,但是避免重复的更简单的解决方案只是在第一个使用点之前移动函数定义,因为定义也是一个声明。