C語言中函數聲明實現的位置


在學習C語言的時候我遇到了這么個事情,因為之前先學習的C#,在C#編譯器中,函數的聲明位置不會影響編譯的結果,但是在C語言中卻發生了錯誤

先看一段代碼:

#include <stdio.h>

int main()
{
    fun1();
    fun1();
    fun1();
    fun2(); 
    return 0;
} 

/*方法1.用於輸出消息1*/
void fun1()
{
    printf("For he's a jolly good fellow!\n");
}

/*方法2,用於輸出消息2*/ 
void fun2()
{
    printf("Which nobody can deny!\n");
}

這時候編譯器提示如下

--------------------配置: mingw5 - CUI Debug, 編譯器類型: MinGW--------------------

正在編譯 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c...
[Error] C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c:27: error: conflicting types for 'fun1'
[Error] C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c:10: error: previous implicit declaration of 'fun1' was here
[Error] C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c:33: error: conflicting types for 'fun2'
[Error] C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c:13: error: previous implicit declaration of 'fun2' was here
[Warning] C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c:35:2: warning: no newline at end of file

編譯中止 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c: 4 個錯誤, 1 個警告

提示出錯,出現這個問題的原因是函數沒找到?對於E文不好的我,這下可難壞我了,怎么辦...

那我換個方式試試

#include <stdio.h>

/*方法1,用於輸出消息1*/ void fun1() { printf("For he's a jolly good fellow!\n"); } /*方法2,用於輸出消息2*/ void fun2() { printf("Which nobody can deny!\n"); } int main() { fun1(); fun1(); fun1(); fun2(); return 0; }

編譯之后結果顯示

--------------------配置: mingw5 - CUI Debug, 編譯器類型: MinGW--------------------

正在編譯 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c...

完成編譯 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c: 0 個錯誤, 0 個警告
生成 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.o

說明,之前的猜測正確,那么我們再想想,C語言學習的時候說過函數聲明,那我們要不要再試試把之前編譯錯誤的那段代碼在main函數之前聲明一次看看能不能編譯成功

 1 #include <stdio.h>
 2 
 3 void fun1(void);
 4 void fun2(void);
 5 
 6 int main()
 7 {
 8     fun1();
 9     fun1();
10     fun1();
11     fun2(); 
12     return 0;
13 } 
14 
15 /*方法1,用於輸出消息1*/ 
16 void fun1()
17 {
18     printf("For he's a jolly good fellow!\n");
19 }
20 
21 /*方法2,用於輸出消息2*/ 
22 void fun2()
23 {
24     printf("Which nobody can deny!\n");
25 }

 編譯器編譯結果:

--------------------配置: mingw5 - CUI Debug, 編譯器類型: MinGW--------------------

正在編譯 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c...

完成編譯 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c: 0 個錯誤, 0 個警告
生成 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.o

 

編譯成功,說明了C和C#的區別之處,所以在以后C編程之旅中我們需要謹記需要使用自定義函數的時候,那么就盡量讓自定義函數的聲明和實現出現在main 函數之前。

在這里我想說,娘啊,我好后悔上學的時候不好好學英語~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM