在學習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 函數之前。
在這裡我想說,娘啊,我好後悔上學的時候不好好學英語~~