第一,#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;
}
…
}
第八,extern,extern可以置于變量或者函數前,以標示變量或者函數的定義在別的文件中,提示編譯器遇到此變量和函數時在其他模塊中尋找其定義。
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 一般形式為:sizeof(object),也可以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;
}