程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言-函數

C語言-函數

編輯:關於C語言

C語言-函數


C語言中的函數,類似於在C#和Java中中的方法,函數一般分為可以主函數(一般一個PC程序只有一個主函數,也就是程序的入口,這是編譯器的約定,如果你覺得不爽可以寫鏈接器腳本直接,可以不使用main作為程序的入口),自定義函數(想想面向對象中必備的各種類,各種Helper,Util吧),庫函數(stadio提供的printf和scanf函數),函數的定義和使用比較簡單,先看一段代碼:     #include<stdio.h> void main(){     printf("sum相加%d\n",sum(100,200));     printf("div求余%d",div(300,100));     getchar(); } int sum(int numberA,int numberB){     return numberA+numberB; } int div(int numberA,int numberB){     return numberA/numberB; }  sum和div這兩個函數是為求和和取余的時候調用的,我們看下簡單的C#代碼:     static void Main(string[] args)       {           Console.WriteLine("sum求和:{0}", sum(100, 200));           Console.ReadKey();       }       static int sum(int a,int b)       {           return a + b;       }  極其相似的風格,不過上面的那段C程序在VS中是不會報錯的,不過在標准的C語言編譯器上是會報錯的,因為默認情況下程序從上往下執行後面的定義的函數可以調用前面定義的函數;其實上面的那段C程序,應該提前定義sum,div,兩種定義的寫法,可以不需要參數比如說sum;     #include<stdio.h> int sum(int,int); int div(int numberA,int numberB); void main(){     printf("sum相加%d\n",sum(100,200));     printf("div求余%d",div(300,100));     getchar(); } int sum(int numberA,int numberB){     return numberA+numberB; } int div(int numberA,int numberB){     return numberA/numberB; } 上面的代碼如果按照面向對象的思想來看需要封裝,正常邏輯會想著將最上面的函數聲明,和最下面的函數實現給封裝,事實上C語言也確實就是這麼解決問題的,給出的解決方案是添加一個.h文件和.c文件;我們先來看下實現,然後具體的講下實現的過程,分別定義一個Calculate.h和Calculate.c文件;   Calculate.h中代碼:     int sum(int,int); int div(int numberA,int numberB);  Calculate.c中代碼:     int sum(int numberA,int numberB){     return numberA+numberB; } int div(int numberA,int numberB){     return numberA/numberB; }  主函數調用:     #include<stdio.h> #include"Calculate.h" void main(){     printf("sum相加%d\n",sum(100,200));     printf("div求余%d",div(300,100));     getchar(); }   一般來說編譯器編譯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吧:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved