首先看下面main.c,test()和add()都未聲明,但編譯時不會報錯
[html]
#include <stdio.h>
void main()
{
printf("%d\n",test());
}
int test()
{
return add(1,2);
}
int add(int x,int y)
{
return x+y;
}
#include <stdio.h>
void main()
{
printf("%d\n",test());
}
int test()
{
return add(1,2);
}
int add(int x,int y)
{
return x+y;
}
運行輸出結果為:3
接著修改程序如下:
[html]
#include <stdio.h>
void main()
{
printf("%d\n",test());
}
static int test()
{
return add(1,2);
}
static int add(int x,int y)
{
return x+y;
}
#include <stdio.h>
void main()
{
printf("%d\n",test());
}
static int test()
{
return add(1,2);
}
static int add(int x,int y)
{
return x+y;
}
編譯時報錯,提示test()和add()未聲明。
為什麼會這個樣子呢,於是我又試著修改了一下程序:
[html]
#include <stdio.h>
void main()
{
test();
void test()
{
//return add(1,2);
add(1,2);
}
void add(int x,int y)
{
//return x+y;
x+y;
}
#include <stdio.h>
void main()
{
test();
void test()
{
//return add(1,2);
add(1,2);
}
void add(int x,int y)
{
//return x+y;
x+y;
}
這次報錯了,注意了,和第一個例子相比只是將函數返回值不同而己!
接著先給出函數聲明:
[html]
#include <stdio.h>
void test();
void add(int x,int y);
void main()
{
test();
}
void test()
{
//return add(1,2);
add(1,2);
}
void add(int x,int y)
{
//return x+y;
x+y;
}
#include <stdio.h>
void test();
void add(int x,int y);
void main()
{
test();
}
void test()
{
//return add(1,2);
add(1,2);
}
void add(int x,int y)
{
//return x+y;
x+y;
}
編譯順利通過。
總結如下:
1.一般情況下,函數在調用子函數時,子函數必須先聲明,要不會報錯。(一般都將函數的聲明放在一下頭文件裡)
2.如若子函數為返回值是int時,可不用聲明,因為編譯器會為子函數默認一個聲明,返回值為int類型的,所以最開始的那個例子才不會報錯。
3.static修飾的函數作用域為從聲明/定義處到源文件結尾處為止。