jasmine214--love

只有当你的内心总是充满快乐、美好的愿望和宁静时,你才能拥有强壮的体魄和明朗、快乐或者宁静的面容。
posts - 731, comments - 60, trackbacks - 0, articles - 0

从c文件源码中熟悉C--整理1

Posted on 2010-12-28 17:40 幻海蓝梦 阅读(325) 评论(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;

        }



只有注册用户登录后才能发表评论。


网站导航: