在學習 c 語言的過程中,手動使用 clang 進行編譯的時候,碰到自定義函數會報出下面的錯誤:
error: implicit declaration of function 'm' is invalid in C99
[-Werror,-Wimplicit-function-declaration]
(gcc 中會報出 warning,而不是 error)
經過排查,發現是沒有在頭文件那里提前聲明自定義函數,所以提前聲明之后再進行編譯就 OK 了.
這種聲明稱為函數原型,作用是讓編譯器在編譯時對程序中的函數調用檢查合法性.非法的函數調用將導致編譯失敗,即出現語法錯誤,用戶可以根據錯誤信息來調試程序.
同時在函數原型中,可以省略各個形參的名稱,而只寫出形參類型:
int m(int, int);
簡單舉例:
1 #include <stdio.h> 2 3 int m(int x, int y); // 在這里提前進行聲明 4 int main(int argc, char const *argv[]) 5 { 6 int a, b, c; 7 printf(" 輸入兩個整數:\n"); 8 scanf("%d%d", &a, &b); 9 c = m(a, b); 10 printf("%d\n", c); 11 return 0; 12 } 13 14 int m(int x, int y) { 15 int z; 16 z = x > y ? x : y; 17 return z; 18 }
或者是把 main 函數寫在文件最下面,也就是自定義函數在上,main 函數在下:
1 #include <stdio.h> 2 3 int m(int x, int y) { 4 int z; 5 z = x > y ? x : y; 6 return z; 7 } 8 9 int main(int argc, char const *argv[]) 10 { 11 //int m(int x, int y); 12 int a, b, c; 13 printf(" 輸入兩個整數:\n"); 14 scanf("%d%d", &a, &b); 15 c = m(a, b); 16 printf("%d\n", c); 17 return 0; 18 }