1. 程式人生 > >C語言程式碼編寫技巧(1)

C語言程式碼編寫技巧(1)


在FreeBSD中分析IPv6原始碼時,得出幾條C語言程式碼編寫技巧:

1、根據巨集定義來實現對不同網路的支援,這樣的switch語句中結合巨集定義套用預編譯指令,有利於減小編譯後的核心大小,使得程式結構更清晰,執行更快;如在if_ethersub.c中switch模組:


 switch (ether_type) {
#ifdef INET
    case ETHERTYPE_IP:
......break;
    case ETHERTYPE_ARP:
 ........   break;
#endif
#ifdef IPX
 case ETHERTYPE_IPX:
.......  break;
#endif
#ifdef INET6
 case ETHERTYPE_IPV6:
 .......  break;
#endif
#ifdef NETATALK
 case ETHERTYPE_AT:
  .......  break;
 case ETHERTYPE_AARP:
 .......  break;
#endif
 default:
  .......    break;
 }

2、對需要頻繁處理的模組,加入到一個檔案模組中。節點在處理接收到的資料報時,因為每個節點都需要對擴充套件首部中的逐跳選項首部進行處理,所以把此模組編輯到和IPv6頭部一起處理的ip6_input模組中,其他擴充套件首部並不是都需要處理的,有的只在源或者目的主機才處理,如FRAG分片首部。這樣加快資料報的處理,提高網路速度。

3、Goto語句的使用。在一個函式中,若有很多相同功能的小模組(10行左右),可以集合到一起,如出錯處理等,通過goto聯絡起來。這樣的模組一般放在函式的尾部,使得程式結構更加清晰;

4、複雜資料結構的簡單化。可以通過#define來對複雜資料結構成員的重新定義,這樣使結構變數更直觀,方便維護和閱讀;如:
struct ip6_hdr {
 union {
  struct ip6_hdrctl {
   u_int32_t ip6_un1_flow; 
   u_int16_t ip6_un1_plen; 
   u_int8_t  ip6_un1_nxt;
   u_int8_t  ip6_un1_hlim; 
  } ip6_un1;
  u_int8_t ip6_un2_vfc; 
 } ip6_ctlun;
 struct in6_addr ip6_src; 
 struct in6_addr ip6_dst; 
} ;

#define ip6_vfc  ip6_ctlun.ip6_un2_vfc
#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
#define ip6_nxt  ip6_ctlun.ip6_un1.ip6_un1_nxt
#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim

5、類函式巨集呼叫(也叫帶引數的巨集)和函式呼叫,這是一個在C中很明顯的時空轉換問題。類函式巨集的反應時間快、佔用空間多;函式則相反,時間響應慢、空間佔用低。在預處理的時候,類函式巨集就被編譯到源程式中,這樣不存在呼叫時間的問題,而函式相對來說則是獨立的,在需要時才去呼叫——動態呼叫。如類函式巨集:


#define panic(param) { printf(param); exit(-1); }


若是小功能模組,可以考慮用類函式巨集實現,方便快捷。

相關推薦

C語言程式碼編寫技巧(1)

在FreeBSD中分析IPv6原始碼時,得出幾條C語言程式碼編寫技巧: 1、根據巨集定義來實現對不同網路的支援,這樣的switch語句中結合巨集定義套用預編譯指令,有利於減小編譯後的核心大小,使得程式結構更清晰,執行更快;如在if_ethersub.c中switch模組:  

c語言程式碼比較18bb/1

kata1: 我的程式碼: 別人的程式碼1: 用數學公式實現 第n個數是1+2+3+4…+n = (1+n)n/2; 進而結果是對求和的求和 對(1+n)n/2遍歷1 to n; 進而sum = 1/2 * (12 + 23 +34+…+nn+1) 即 sum = 1/

c語言程式碼編寫的遊戲“簡易五子棋”

編譯程式碼 #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h> #define MAXIMUS 15 //定義棋盤大小 i

GSM A5/1演算法C語言程式碼實現和分析

介紹 全球超過200個國家和地區超過10億人正在使用GSM電話。對中國使用者來說,GSM就是移動和聯通的2g模式。 在1982年A5首次提出時,人們認為A5 / 1金鑰長度要128位,但最終確定的結果是64位金鑰(政府可以使用暴力破解算出)。很可能是政府的壓力迫使金鑰位數縮

C語言編寫程式數一下 1到 100 的所有整數中出現多少次數字9

 編寫程式數一下 1到 100 的所有整數中出現多少次數字9 思路:1到 100 的所有整數中出現多少次數字9,這個問題我們可以看作是兩位整數中個位和十位上總共有多少個9,在兩位數中,一個數整除10餘下的結果是它的個位數,除以10是它的十位數,把個位數和十位數上有9的次數算出來就可以了

微控制器C語言程式碼_經驗技巧

1、如果可以的話少用庫函式,便於不同的mcu和編譯器間的移植   2、選擇合適的演算法和資料結構   應該熟悉演算法語言,知道各種演算法的優缺點,具體資料請參見相應的參考資料,有很多計算機書籍上都有介紹。將比較慢的順序查詢法用較快的二分查詢或亂序查詢法代替,插入排

C語言程式碼1(素數判斷及優化)

//素數判斷優化 #include<stdio.h> #include<math.h> int main() {int n=0, i=0, count=0;for(n=101; n<200; n=n+2){for(i=2; i<sqrt(n); i++){if( n%i==

C語言程式碼漏洞審計技巧筆記分享

c語言程式碼審計和安全漏洞檢查主要容易出現在介面和輸入輸出位置上。 c language code review note 1 引數和指令檢查 command: argc argv 注意此處為使

C語言宏定義技巧——多次包括頭文件內容不同

ear 文件 我們 art bsp enum class 包括 nbsp 1、 頭文件定義例如以下: /* declears in “funcs.h” */ FUNC_1(ID_FUN1_001) FUNC_1(ID_FUN1_002) FUNC_2(ID_FUN2_

C語言基礎復習1

c語言基礎知識鞏固strlen() 和sizeof()的區別1. sizeof()是操作符,可以計算任意類型的大小(包括函數類型)。 2.strlen()是函數, 需要引入頭文件<string.h>,只能計算char* 類型以 ‘\0‘ 結束的字符串的大小。 3. 數

【數據結構與算法分析——C語言描述】練習1.1——選擇問題

problem 內容 語言 log %d include oid define signed 本部分內容來自http://www.cnblogs.com/mingc,筆者在此只用於整理學習。 問題描述:編寫一個程序解決選擇問題。令k=N/2。畫出表格顯示你的程序對於N為

C語言模擬圖靈機X+1

[] ems 掃描 program 循環控制 class cnblogs add 循環 1 #include "stdafx.h" 2 #include <iostream> 3 #include <stdio.h> 4 #include

[轉]C語言常見錯誤總結1

process log item 它的 too 問題 程序 副本 proc 指針與數組的對比c程序中,指針和數組在不少地方可以相互替換著用,讓人產生一種錯覺,以為兩者是等價的 數組要麽在靜態存儲區被創建(如全局數組),要麽在棧上被創建。數組名對應著(而不是指向)一塊內存,其

C語言程序編寫中犯的錯誤的記錄(一)

C 程序編寫 錯誤 今天學習用到了《C程序設計(第四版)》的求兩個數的最大值的程序devcpp程序:#include <stdio.h>int main(){int max(int x,int y);int a,b,c;scanf("%d,%d",&a,&a

CRC32 C語言程式碼 和 JAVA程式碼

C語言如下: uint32_t crc32_compute(uint8_t const * p_data, uint32_t size){    uint32_t crc;    crc = 0xFFFFFFFF;    for (uin

CRC8 C語言程式碼 和 JAVA 程式碼

crc8 從語言程式碼如下: unsigned char const crc8_tab[256]   =   {      0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x

設計一款c#自動程式碼生成器 (1

1,構思配置驅動檔案生成 網上自動化指令碼生成的思路是 1)設定好對應的模板 2)讀取資料庫對應的檔案 3)根據模板對應的欄位替換生成 模板》讀取資料》生成對應檔案 為什麼會有做自動化指令碼的想法,是因為工作中發現protobuf 這個工具可以自動編譯根據伺服器生成對應的cs檔案 所以我這裡想仿

如何在ubuntu中寫一個簡單的C語言程式碼並編譯執行

首先需要安裝一個編譯器 因為筆者也是剛剛開始學習ubuntu所以不知道各個編譯器之間的區別,筆者所用的是gcc就簡單介紹一下gcc的安裝方法吧。 方法一: 開啟控制檯輸入以下程式碼: sudo apt-get build-dep gcc; sudo apt-get bui

快速傅立葉變換FFT的學習筆記一:C語言程式碼的簡單實現

快速傅立葉變換FFT的學習筆記一:C語言程式碼的簡單實現 fft.c #include "math.h" #include "fft.h" void conjugate_complex(int n,complex in[],complex out[]) { int i = 0

C語言計算:t=1-1/(2*2)-1/(3*3)-...-1/(m*m)

#include <stdio.h> #include <stdlib.h> #include <math.h> int main() {     int  m,i;     int n;