### 調用函數
創建 C 函數時,會定義函數做什么,然后通過調用函數來完成已定義的任務。
當程序調用函數時,程序控制權會轉移給被調用的函數。被調用的函數執行已定義的任務,當函數的返回語句被執行時,或到達函數的結束括號時,會把程序控制權交還給主程序。
調用函數時,傳遞所需參數,如果函數返回一個值,則可以存儲返回值。例如:
```
#include <stdio.h>
/* 函數聲明 */
int max(int num1, int num2);
int main ()
{
/* 局部變量定義 */
int a = 100;
int b = 200;
int ret;
/* 調用函數來獲取最大值 */
ret = max(a, b);
printf( "Max value is : %d\n", ret );
return 0;
}
/* 函數返回兩個數中較大的那個數 */
int max(int num1, int num2)
{
/* 局部變量聲明 */
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
```
把 max() 函數和 main() 函數放一塊,編譯源代碼。當運行最后的可執行文件時,會產生下列結果:
~~~
Max value is : 200
~~~
* [ ] **知識點:函數調用時需注意先后函數存在的先后順序**
比如A函數調用B函數,則B函數的聲明一定要在A函數的前面,否則會出現報錯:B函數找不到標識符。
如正常代碼如下:
```
#include "stdafx.h"
#include <iostream>
int func(void)
{
printf("函數");
return -1;
}
int func(void* pathName, int a)
{
printf("函數");
return -1;
}
int main()
{
func();
}
```
如果我們將func函數移到main函數后面,即
```
#include "stdafx.h"
#include <iostream>
int main()
{
func();
}
int func(void)
{
printf("函數");
return -1;
}
int func(void* pathName, int a)
{
printf("函數");
return -1;
}
```
運行就會報錯如下:

原因如下:在C語言里面,程序加載過程是由上至下來進行加載,到加載到main函數時沒有找到func函數(此時func函數還沒有被加載到內存,會認為func函數沒有,不存在),而Java中為啥可以呢?因為Java是面向對象的,它對于整個class文件,會整個加載到內存,它不會分為上下。
* [ ] **為什么C語言這樣設計?**
因為C語言是以函數為基礎,它不像Java一樣以類為基礎,類作為一個對象,所有的方法都可以寫在類中。C程序是以每一個函數組成的,當設計一個應用程序之后,它會產生很高的耦合,所以C語言中的眾多的頭文件就相當于每一個接口,這些頭文件不會參與編譯,真正參與編譯的是這些頭文件實現的C文件,頭文件的存在就是為了解決程序的耦合問題。
* [ ] **解決方案**:
* 第一種方案就是,將func定義在main函數前面,就是剛開始正確的代碼
* 第二種方案就是,編寫頭文件,將func函數聲明在該頭文件中,切記只有函數的聲明,沒有函數的實現,類似于Java中的接口,具體步驟:右面解決方案資源管理器中找到源文件,右鍵,添加,新建項,如圖所示


func.h如下
```
int func(void);
int func(void* pathName, int a);
```
引用頭文件如下:

**注意:如果是自定義的頭文件,是雙引號,系統的自帶的頭文件則是尖括號**
* [ ] **#include 指令**
`#include`指令主要有兩種書寫格式. 第一種格式用于屬于C語言自身庫的頭文件:
```
[#include指令(格式1)] #include <文件名>
```
第二種格式用于所有其他頭文件,也包含任何自己編寫的文件:
```
[#include指令(格式2)] #include "文件名"
```
這兩種格式間的細微差異在于編譯器定位頭文件的方式。下面是大多數編譯器遵循的規則。
* `#include <文件名>`:搜尋系統頭文件所在的目錄(或多個目錄)。(例如,在UNIX系統中,通常把系統頭文件保存在目錄/usr/include中。)
* `#include "文件名"`:先搜尋當前目錄,然后搜尋系統頭文件所在的目錄(或多個目錄),通常可以改變搜尋頭文件的位置,這種改變經常利用諸如-I路徑這樣的命令選項來實現。
這樣如下代碼
```
#include "stdafx.h"
#include <iostream>
#include "func.h"
int main()
{
func();
}
int func(void)
{
printf("函數");
return -1;
}
int func(void* pathName, int a)
{
printf("函數");
return -1;
}
```
再次運行就不會報錯