㈠ C語言的編程格式是怎麼樣的
1,C語言程序的結構特點
一個C語言程序通常由一個預處理語句開始,如#include〉stdio.h〉,它表示,在編譯語言程序前,用指明的文件取代改預處理語句,通常文件名是帶有後綴為.h的磁碟文件.編譯時,它將從磁碟中讀出並插入到原來的預處理程序語句中.即預處理語句被指明的包含文件(頭文件)代替.
頭文件通常是在程序中被調用函數的說明語句和該函數用到的一些符號常量的宏定義.如在程序中經常調用一些標准庫函數時,系統提供了相應的頭文件,他們其中的一些內容是對該函數的說明及該函數用到的符號常量的宏定義等,如對fgets()的說明放在頭文件stdio.h中,再蓋頭文件包含了對fgets()函數的說明:
char *fgets(char *s,int n,FILE *stream)
對符號常量的定義:
#define NULL 0
當然還包含了一些其他的標准I/O函數的說明和宏定義等.用戶也可以建立自己的頭文件,在程序開頭用include進行包含就行了:
#include"文件名"
注意此時用" "符號來包括,它與 #include〉文件名〉的區別是查找的路徑不同.前者表示現在當前目錄中查找該文件,如果找不到,再到系統指定的目錄中查找.而後者只在系統的制定目錄中查找(一般是include\目錄),若找不到,便報錯.所以用#include"文件名"的形式常用於用戶自己寫的包含文件,他們通常放在和用戶程序同一個目錄下.當然在這種形式中,文件名也可用文件路徑代替,這時,編譯器就去用戶指定的目錄去查找包含文件.文件包含也可以用在程序行中,如:
main()
{
...
#include "myc.c"
...
}
其中myc.c時用戶的c文件,編譯時,它將從磁碟中取出,插入到該位置處.
一些在程序中常用到的常量也用編譯預處理命令#define來定義,如在真假判斷時,常用符號常量TURE和FALSE表示真和假,這時可以用一下定義:
#define TURE 1
#define FALSE 0
將以上代碼寫在程序的開頭,編譯時在程序中出現TURE的地方都用1代替,出現FALSE的地方用0代替.
一個完整的C程序,總是由main()函數開始,它像一個大型樂曲的引子,由此引出許多樂章(執行不同的功能的函數);main()函數又像一個大型建築的框架,它顯示了要完成這個建築的輪廓,這些輪廓就是由一個個函數調用勾畫出來的.因此可以說一個C程序是由一個個的模塊堆砌起來的,這些模塊的最小元素是函數.當然,模塊也可以是一個源程序,它又有許多的函數組成.所以c程序的設計是一種模塊化的設計,是許多的函數的堆砌.因此在應用程序的設計中,應將一個個的功能用一個個的函數來實現.下面就談談函數的使用.
turbo C的函數的使用
Turbo C2.0提供了400多個標準的庫函數,每個函數都完成一定的功能.當程序執行這些功能時,只要調用這些函數即可,用戶不必再自己寫這些函數了.這些庫函數包括輸入輸出函數,數學函數,字元串處理函數,內存函數,與BIOS和Dos有關的介面函數,屏幕函數和圖形函數,過程式控制制函數和目錄函數等.這些函數在我的主頁上都能查到,歡迎來查詢.
當標准庫函數中沒有用戶要用的函數時,就必須自己設計了,設計函數的原則是:
1,函數不應處理太多的功能,要保持函數的小型化,功能單一化.
2,一個函數要保持自己的獨立性,如同一個黑匣子一樣,有進有出.
3,在函數中多使用復合語句,使函數也具有結構化,並且可以提高執行效率和節省存儲空間.
4,在主函數前,要羅列出所有使用自定義函數的原型說明,這有利於在大型程序設計中追蹤要調用的函數設置是 否正確.
5,在程序適當的地方加入注釋(用/*...*/包含的語句)這便於程序的閱讀和調試.
6,採用層次的書寫程序格式,按程序的不同功能分層次.
這樣一個函數編譯後,其內部定義的程序代碼與數據與另一個函數的程序代碼和數據不會相互影響,因此在函數中要使用局部變數,即它的生存期指維持在調用該函數並執行時,也就是說函數被激活時.要盡量少用或不用全局變數,它將破壞函數的獨立性.函數的這種設計方法類似於面向對象設計方法中的封裝性.
C大型軟體程序的設計步驟
C語言作為結構化的程序設計語言,易採用自頂向下的設計方法,即開始咱不涉及問題的實質和具體的解決步驟,而只是從問題的全局出發,給出一個概括性的抽象描述.例如編寫一個信號處理程序,它要求對信號數據經過數字處理後進行圖形顯示並存檔.因而程序大輪廓應該是:
1,信號數據的輸入
2,信號預處理
3,信號進行數字處理
4,進行顯示
5,進行存檔
接著對各項功能進行細分,例如對於信號的輸入,又可分為:
1.通過com1或com2由RS-232介面進行輸入
2.由磁碟數據文件輸入
對信號預處理又可分為:
1.對信號進行反序排列
2.用窗函數預處理
對數字處理又可分為:
1.求快速傅立葉變換
2.求功率譜
對用窗函數處理又可分為:
1.海明窗處理函數
2.漢寧窗處理
3.布拉格曼窗處理
其他功能依此類推.
在此細化的基礎上再進行細化,以至於成為一個個單獨的功能,便於用一個個函數來實現.
下面就是設計一個個函數的實質性階段.要定義變數,要選區標准函數,要確定演算法,這是構造程序的基本單元.當一個個函數都設計完了以後,便可將這些函數在主函數中堆砌起來,並用主函數做總控程序,完成對他們的參數傳遞,控制選擇對這些函數的調用,形成一個完整的實用的信號處理程序.
大程序的設計風格
當一個程序較大時,可將一個程序分成幾個部分,每一個部分可單獨編成一個源文件,這些源文件可進行單獨編譯成.obj文件,然後將這些文件組合成一個較大的程序.通常可採用如下方法:
1.include方法
例如,一個程序分成兩個源文件,既由a1.c和a2.c兩個源程序組成,這時候可將a1.c寫成:
#include〉stdio.h〉
#include"a2.c"
main()
{
...
strcpy(s1,s2);
a2();
...
}
而a2.c可寫成:
#include〉string.h〉
void a2()
{
....
}
然後在製作一個project文件,內容為:a1.c a2.c
設這個工程文件名為:a1.prj,其中文件中各文件名的後綴可省略,先後順序也無關,它隻影響編譯時的順序.者可在Turbo c的編輯狀態下寫成,並存檔為a2.prj文件.然後用Alt+p選擇Project菜單中的Project_name項,填寫生成的a1.prj文件名.然後按F9,即可生成a1.exe可執行文件.
當用匯編語言與C語言混合編程時,則要將匯編語言子程序單獨編譯生成.obj文件,然後製作工程文件,再進行對C程序的編譯和連接.關於這方面的介紹可參考Turbo c2.0的命令行編譯.
若程序還需要一些其他的被編譯的程序或庫文件,這些文件時C語言的標准庫不能提供的,則也可將它們的名字放在Project文件中.如:
mymain
myfunc
secial.obj
other.lib
當用F9進行編譯連接時,對後綴為.obj的文件只進行連接,對後綴為.lib的庫文件不會進行編譯,只是進行連接,這樣當進行外部調用時,就只會對庫進行檢索.
當多個源文件製作成project 文件時,一個.c的源文件依賴於其他的.c源文件,若它們之間用一個頭文件來進行介面,這時應用括弧將這些頭文件擴起來(頭文件之間可用逗號,空格或分號間隔),這樣一旦頭文件改變時,它們將被重新編譯,例如:有一個主程序名為mymian.c,它包含頭文件為:myfuncs.h,而另一個文件是myfuncs.c
這樣當project文件的內容寫成如下形勢時:
mymain.c(myfuncs.h)
myfuncs.c(myfuncs.h)
若一旦myfuncs.h被修改,則對該project文件進行編譯時,mymain.c及myfuncs.h將被重新編譯
㈡ 請問我有一個.so文件,如何在linux下編程使用呢
-lxx
xx是你的.so文件名
其實使用方法和你使用數學庫函數是一樣的,源代碼中添加
#include <math.h>,編譯的時候,加上-lm參數。
註:linux下的.so文件為共享庫,相當於windows下的dll文件。
linux下編寫調用so文件實例
.so是Linux(Unix)下的動態鏈接庫. 和.dll類似.
比如:
文件有: a.c, b.c, c.c
gcc -c a.c
gcc -c b.c
gcc -c c.c
gcc -shared libXXX.so a.o b.o c.o
要使用的話也很簡單. 比如編譯d.c, 使用到libXXX.so中的函數, libXXX.so地址是MYPATH
gcc d.c -o d -LMYPATH -lXXX
注意不是-llibXXX
test.c文件和一個test.h,這兩個文件要生成libsotest.so文件。然後我還有一個testso.c文件,在這個文件裡面調用libsotest.so中的函數。
編寫的過程中,首先是編譯so文件,我沒有編寫makefile文件,而是參考的2裡面說的直接寫的gcc命令。
因為so文件裡面沒有main函數,所以是不可執行的,所以編譯的時候要加上-c,只生成目標文件。
㈢ 請問我有一個.so文件,如何在Linux下編程使用呢
要在Linux下編程使用`.so`文件,首先確保你有一個名為`libXXX.so`的共享庫文件。使用該共享庫的方法與使用數學庫函數類似。在源代碼中,你需要添加`#include `來包含數學函數的頭文件。編譯時,使用`-lm`參數來鏈接數學庫。
請注意,`.so`文件是Linux下的共享庫,類似於Windows中的`dll`文件。
下面是一個調用共享庫的示例:
1. 創建三個源文件:`a.c`, `b.c`, `c.c`。
2. 使用`gcc`編譯這些文件,但不執行鏈接操作,以生成目標文件(`.o`):
```
gcc -c a.c
gcc -c b.c
gcc -c c.c
```
3. 使用`gcc`將目標文件鏈接成共享庫`libXXX.so`:
```
gcc -shared libXXX.so a.o b.o c.o
```
要使用這個共享庫,假設你的共享庫文件位於`MYPATH`,你可以編譯`d.c`文件並鏈接共享庫:
```
gcc d.c -o d -LMYPATH -lXXX
```
對於你提到的`test.c`和`test.h`,以及`testso.c`,你需要先編譯`.c`文件以生成`.o`目標文件。由於`.so`文件中沒有`main`函數,它不是可執行文件,因此編譯時應使用`-c`選項來僅生成目標文件。
確保在編寫`.so`文件時,如果你沒有編寫`makefile`,可以參考以上步驟直接使用`gcc`命令進行編譯。