jasmine214--love

          只有當你的內心總是充滿快樂、美好的愿望和寧靜時,你才能擁有強壯的體魄和明朗、快樂或者寧靜的面容。
          posts - 731, comments - 60, trackbacks - 0, articles - 0

          從c文件源碼中熟悉C--整理1

          Posted on 2010-12-28 17:40 幻海藍夢 閱讀(335) 評論(0)  編輯  收藏 所屬分類: LinuxC語言學習

           

          第一,#define宏定義,  語法:#define 語義名 代號名,#define預編譯處理命令,主要定義常量,此常量可以為任何的字符及其組合,在編譯之前,將此常量出現的所有位置,用其代表的字符或字符組合無條件 的替換,然后進行編譯。#define CE_STT_FALSE ( 0 )

          條件編譯:#ifndef、(或者#ifndef)#def#endif等宏這幾個宏是為了進行條件編譯。一般情況下,源程序中 所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是條件編譯。有時,希望當滿 足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。

          #ifdef SINGLE_PROCESS

              #define main(x) main_timer(x)

          #endif

          有人會問:不用條件編譯命令而直接用if語句也能達到要求,用條件編譯命令有什么好處呢?的確,此問題完全可以不用條件編 譯處理,但那樣做目標程序長(因為所有語句都編譯),而采用條件編譯,可以減少被編譯的語句,從而減少目標的長度。當條件編譯段比較多時,目標程序長度可 以大大減少。

           

          第二,typedef類型重命名:為了更加見名知義 ,語法:typedef 原類型 目標類型,typedef是為已知數據類型增加一個新名稱,其原理與使用int double等保留字一致。

          typedef struct

          {

              UCHAR addr[MAC_ADDR_LEN];

          }MAC_ADDR;

           

          第三,導入頭文件到.c文件中:

          #include "sys_common.h"

           

          第四,static 變量和靜態函數,

          C static有了第二種含義:用來表示不能被其它文件訪問的全局變量和函數。但為了限制全局變量/函數的作用域, 函數或變量前加static使得函數成為靜態函數。但此處“static”的含義不是指存儲方式,而是指對函數的作用域僅局限于本文件(所以又稱內部函 數)。注意此時, 對于外部(全局)變量, 不論是否有static限制, 它的存儲區域都是在靜態存儲區, 生存期都是全局的. 此時的static只是起作用域限制作用, 限定作用域在本模塊(文件)內部.
          使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定 義的函數,是否會與其它文件中的函數同名。

           

          第五,條件語句的使用。常量值放在前面做比較的時候

          if (SYS_OK != ret)

                  {

                      DHCPRELAY_LOG("HAL_SendPacket failed. ret= %d\n", (INT)ret);

                  }

           

          第六,enum枚舉,在使用枚舉變量時,主要關心的不是它的值的大小,而是其表示的狀 態。在實際應用中,有的變量只有幾種可能取值。如人的性別只有兩種可能取值,星期只
          有七種可能取值。在 C 語言中對這樣取值比較特殊的變量可以定義為枚舉類型。所謂枚舉
          是指將變量的值一一列舉出來,變量只限于列舉出來的值的范圍內取值。
          定義 一個變量是枚舉類型,可以先定義一個枚舉類型名,然后再說明這個變量是該枚
          舉類型。

          例如:
          enum weekday{sun,mon,tue,wed,thu,fri,sat}

          typedef enum

          {

              DHCPV6_IF_FORMAT_NORMAL,

              DHCPV6_IF_FORMAT_CTC,

          } DHCPV6_IF_FORMAT_E;

           

          第七,break 用法。continue值 結束本次循環,而不是中止整個循環的執行.break語句則是結束整個循環過 程,不再判斷循環條件是否成立.

            switch(level)

              {

                  case CLI_LEVEL_PUBLIC:

                  {

                      pPwd = "public";

                      break;

                  }

             

              }

           

          第八,externextern可以置于變量或者函數前,以標示變量或者函數的定義在別的文件中,提示編譯器遇到此變量和函數時在其他模塊中尋找其定義。

          extern GT_STATUS swSetForceSpeed

          (

              IN GT_LPORT     port,

              IN  GT_PORT_FORCED_SPEED_MODE  mode

          );

           

          第九,return o ;的使用,正常退出。只要一個函數的返回值是數字型的,那么就可以返回0(return 0),其實你返回多少都沒問 題。一般情況 下,C++做出來的函數都要求返回一個值,當函數執行正常,且達到了一般情況下的目的,那么就返回0表示正確的調用了該函數,這個0就是返回給主調函數以 通知沒有出錯的;如果函數調用中出錯,或者沒有按照一般情況執行,那么就返回1,以告知主調函數采取響應策略;

          INT main(void)

          {

           

              VOS_ApplStart("cli",

                                       APPL_CLI,

                                       CLI_Init,

                                       CLI_MsgHandle,

                                       CLI_Destroy); 

             

              return 0;

          }

          .

          第十,三元表達式,可見三元運算符比 if (){}else{} 快一些 

          一元運算符,~ !
          二元運算符, + - * / %
          三元運算符 ?:

          return (NULL == pListNode)?NULL:(TIMER_DATA_T *)(pListNode->data);

           

          第十一,打印輸出,-代表左對齊5表示 不足5位輸出  補足五位數;l表示long   u表示無符號

          \r表示回車,即光標回車當前行首
          \n表示回車換行,即光標前進到下一行的行首
          \0是字符串結束標志(空字符),在字符數組中遇到它就表示前面的字符串到些為止。

          printf("%-5lu %-5x %-4lu %-11lu  %-10lu\r\n",

                         pTimerData->timerId,

                         pTimerData->applyAppl,

                         pTimerData->arg,

                         pTimerData->interval,

                         pTimerData->remainTicks);

          JAVA-------------System.out.println(sort.getSortName());

           

          第十二,數組,一維數組可以使用二維數組的寫法{{}{}}

          char a[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}};

          static CLI_CMD_T g_CliCmdTable[] =

          {

              {"timer print", "timer\nprint timer", cli_TimerPrint, CLI_LEVEL_DEBUG}

          };

           

          第十三,sizeof作用,sizeof 一般形式為:sizeofobject),也可以sizeof var_char,不過大部分programer習慣用sizeof()

               對象可以是表達式或者數據類型名,當對象是表達式時,括號可省略。sizeof是單目運算符,其運算符的含義是:求出對象在計算機內存中所占用的字節數。 一般來講,不同的機器,運行不同的對象是不一樣的,當目前幾乎所有的機器都是32位,很少16位的,所以一般考試都是基于32位的window linux的。

           

          return CLI_RegCmd("Timer", VIEW_NODE, g_CliCmdTable, sizeof(g_CliCmdTable));

           

          第十四,條件語句,case 內嵌套if 表達式及break的組合使用。

          case MSG_TIMER_STOP:

                  {

                      TIMER_ID *pTimerId;

                      pTimerId = (TIMER_ID *)pData;

           

                      if (timer_ApplIdMatchingCheck(*pTimerId, srcAppl - VOS_TASK_MAX_NUM) == TRUE)

                      {

                          ret = timer_Stop(*pTimerId);

                          if (SYS_OK != ret)

                          {

                              //printf("%s:timer_Stop failed, ret[%lu]\r\n", __FUNCTION__, ret);

                          }

                      }

                      else

                      {

                          ret = TIMER_ERR_APPLID_UNMATCHED;

                      }

                      VOS_SyncMsgResponse(srcAppl, MSG_TIMER_STOP, (VOID *)&ret, sizeof(SYS_ERR_TYPE));

                      break;

                  }


          主站蜘蛛池模板: 宜春市| 祁门县| 隆林| 分宜县| 长宁区| 兴业县| 泗阳县| 新泰市| 万宁市| 高尔夫| 涞源县| 吉水县| 胶南市| 常州市| 哈尔滨市| 淮安市| 宁河县| 普宁市| 漳平市| 白城市| 苗栗市| 囊谦县| 惠水县| 建平县| 喜德县| 阜平县| 中牟县| 秦安县| 淄博市| 江津市| SHOW| 阿尔山市| 吉木乃县| 如皋市| 湖南省| 德阳市| 贡觉县| 堆龙德庆县| 京山县| 南安市| 新昌县|