天天看點

C語言-函數

C語言中的函數,類似于在C#和Java中中的方法,函數一般分為可以主函數(一般一個PC程式隻有一個主函數,也就是程式的入口,這是編譯器的約定,如果你覺得不爽可以寫連結器腳本直接,可以不使用main作為程式的入口),自定義函數(想想面向對象中必備的各種類,各種Helper,Util吧),庫函數(stadio提供的printf和scanf函數),函數的定義和使用比較簡單,先看一段代碼:

1

2

3

4

5

6

7

8

9

10

11

12

<code>#include&lt;stdio.h&gt;</code>

<code>void</code> <code>main(){</code>

<code>    </code><code>printf</code><code>(</code><code>"sum相加%d\n"</code><code>,sum(100,200));</code>

<code>    </code><code>printf</code><code>(</code><code>"div求餘%d"</code><code>,</code><code>div</code><code>(300,100));</code>

<code>    </code><code>getchar</code><code>();</code>

<code>}</code>

<code>int</code> <code>sum(</code><code>int</code> <code>numberA,</code><code>int</code> <code>numberB){</code>

<code>    </code><code>return</code> <code>numberA+numberB;</code>

<code>int</code> <code>div</code><code>(</code><code>int</code> <code>numberA,</code><code>int</code> <code>numberB){</code>

<code>    </code><code>return</code> <code>numberA/numberB;</code>

 sum和div這兩個函數是為求和和取餘的時候調用的,我們看下簡單的C#代碼:

<code>static</code> <code>void</code> <code>Main(string[] args)</code>

<code>      </code><code>{</code>

<code>          </code><code>Console.WriteLine(</code><code>"sum求和:{0}"</code><code>, sum(100, 200));</code>

<code>          </code><code>Console.ReadKey();</code>

<code>      </code><code>}</code>

<code>      </code><code>static</code> <code>int</code> <code>sum(</code><code>int</code> <code>a,</code><code>int</code> <code>b)</code>

<code>          </code><code>return</code> <code>a + b;</code>

 極其相似的風格,不過上面的那段C程式在VS中是不會報錯的,不過在标準的C語言編譯器上是會報錯的,因為預設情況下程式從上往下執行後面的定義的函數可以調用前面定義的函數;其實上面的那段C程式,應該提前定義sum,div,兩種定義的寫法,可以不需要參數比如說sum;

13

14

<code>int</code> <code>sum(</code><code>int</code><code>,</code><code>int</code><code>);</code>

<code>int</code> <code>div</code><code>(</code><code>int</code> <code>numberA,</code><code>int</code> <code>numberB);</code>

上面的代碼如果按照面向對象的思想來看需要封裝,正常邏輯會想着将最上面的函數聲明,和最下面的函數實作給封裝,事實上C語言也确實就是這麼解決問題的,給出的解決方案是添加一個.h檔案和.c檔案;我們先來看下實作,然後具體的講下實作的過程,分别定義一個Calculate.h和Calculate.c檔案;

Calculate.h中代碼:

 Calculate.c中代碼:

 主函數調用:

<code>#include"Calculate.h"</code>

  一般來說編譯器編譯C語言的幾個階段:

①預處理編譯階段,讀取c源程式,對其中的僞指令(以#開頭的指令如#include #define)和特殊符号進行處理。掃描源代碼,對其進行初步的轉換,産生新的源代碼提供給編譯器。預處理過程先于編譯器對源代碼進行處理。

②文法和詞法分析階段,這個階段的工作會判斷基本的資料類型定義是不是存在問題,調用的函數是否存在諸如此類的工作;

③編譯階段,首先将C檔案編譯成成純彙編語句,然後将将彙編語句轉換成跟CPU相關的二進制碼,生成各個目标檔案 (.obj檔案);

④連結階段,将各個目标檔案中的各段代碼進行絕對位址定位,生成跟特定平台相關的可執行檔案,也可以用objcopy生成純二進制碼去掉了檔案格式資訊,生成.exe檔案;

在vs項目的bin目錄下是可以看到生成的Demo.obj和Calculate.obj檔案的,這個時候回頭看下include其實就是預先定義了sum和div函數,include可以了解将Calculate.h中的代碼拷貝到Demo.c檔案中,那麼如果我們直接include Calculate.c檔案會如何呢,因為存在Calculate.obj,那麼在連結的過程會報錯,具有重複的辨別符,至于為什麼要分開寫要封裝,以各位面向對象的思想就不用多說了,最後看下目錄和obj吧:

C語言-函數

obj檔案:

C語言-函數

本文轉自Fly_Elephant部落格園部落格,原文連結:http://www.cnblogs.com/xiaofeixiang/p/4202502.html,如需轉載請自行聯系原作者