第一,#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;
}