c语言文件自学总结报告,C语言学习经验总结

C语言学习经验总结

1.类型

在使用C开发时,一个类型占多少个字节是个很重要的信息元素,

像C语言本身的类型系统并不能体现出这一点,容易使人混乱。

一种好的方式是定义一套简洁易懂又一致的类型

比如:定义一个stdint.h头文件

#ifndef__STDINT_H

#define__STDINT_H

typedeflong long int64_t;

typedefunsigned long long uint64_t;

typedefunsigned int uint32_t;

typedefint int32_t;

typedefunsigned short uint16_t;

typedefshort int16_t;

typedefunsigned char uint8_t;

typedefchar int8_t;

#endif

可以继续用已定义的类型去定义新的类型

typedefuint32_t gfx_Color_t;

用_t后缀表示是自定义类型。(这是很好的技巧)

结构体示例:

typedefstruct _gfx_Rect

{

//! \brief X position of upper left corner

int16_t x;

//! \brief Y position of upper left corner

int16_t y;

//! \brief Width of rectangle

int16_t width;

//! \brief Height of rectangle

int16_t height;

} gfx_Rect_t;

2.命名规范(naming convention)

a)定义变量时使用前缀。比如:g_i8MyGlobalVariable

b)函数名称添加模块前缀_,比如:hw_dac_Init()

c)常量、宏全部大写。

3.要精通并善于用宏定义。

任何一个比较大的工程里,必然存在相当庞大的宏定义。理解并用好宏是精通C语言的关键。

a)程序里出现任何确定的数字都应该用宏来代替,以达到以后修改只修改宏即可的目的;当然也更容易代码理解和阅读。

b)充分理解#define替换的本质,看下面的例子,巧妙实现了一种继承机制:

#defineWIDGET_BASIC_PROPERTIES \

struct _Widget *pNext;\

struct _Widget *pParent;\

struct _Widget *pChild;\

const uim_WidgetClass_t *pClass;\

gfx_Rect_t Rect;\

gfx_DeviceContext_t*pDC;\

uint8_tu8AlphaChannel;\

gfx_Color_t u32ChromaColor;\

\

struct {\

uint16_t u16WidgetID: 16;\    //这里是位域,不是结构体

uint16_t uHeartBeat: 16;\      //位域的宽度不能超过它前面类型的大小的宽度,

//并不是通常所说的不能超过一个字节(8位)

//只是往往用到位域的时候都是用unsigned等小类型的,特别是一些布尔类型的位域成员。感觉这里没必要用位域。

};\

struct {\         //注意:这里也是位域

uint8_tMsgGroup:8;\

unsigned bTransparent:1;\

unsigned bInvisible:1

//! \brief Macro indicating the end of the base widget properties.

#defineWIDGET_END_OF_BITFIELD_PROPERTIES }

typedefstruct _Widget {

WIDGET_BASIC_PROPERTIES;

WIDGET_END_OF_BITFIELD_PROPERTIES;

} Widget_t;

typedefstruct _myWidget {

WIDGET_BASIC_PROPERTIES;

WIDGET_END_OF_BITFIELD_PROPERTIES;

uint8_tu8MyData;

} MyWidget_t;

在#define中加反斜杠(\)表示续行。

这是一个非常妙的用法。它将_Widget结构体的成员抽出来,定义成宏,以实现继承机制。

也就是说继承自这个Widget_t的类只要加入上面的宏也就拥有了与之相同的成员。

它这里甚至允许子类继续扩展父类的位域,利用的技术就是把位域定义中的最后一个括号定义成宏,因为宏是纯粹的替换。

4. 善用结构、枚举、位域、联合

要熟练掌握它们,特别是前两个,会有大量的应用,然后是位域,往往嵌套在结构体定义中。

结构体可以看做是一种自定义的数据类型,它还有一个很重要的特性,就是结构体可以相互嵌套使用,但也是有条件的,不能在结构体中包含自身结构体变量,但自身指针是可以的,其他struct变量也是可以的。

struct test

{

char name[10];

float socre;

test *next;

};//这样是正确的!

struct test2

{

char name[10];

float socre;

};

struct test

{

char name[10];

float socre;

test2 ts;

};//这样是正确的!

struct test

{

char name[10];

float socre;

test next;

};//这样是错误的!

4.熟练应用条件编译

在涉及模块非常多的大工程里,会有许多比如:选择性初始化、选择性处理等。这时就会用到条件编译,这是非常有用的功能。例:#ifdefined(ENABLE_BATTERY_CHARGE)

a)基本格式:

#ifdefaa或if defined(aa)

//处理代码

#endif

b)为了防止头文件重复引入,也用到了此技术

c)   为了使C/C++都可使用某头文件中声明的函数原型,也用到了此技术。

例:#ifdef __cplusplus

extern "C" {

#endif

RtStatus_t km_OpenTaskManager(Widget_t *pWidget);

#ifdef __cplusplus

}

#endif

5.精通位操作

6.   源文件的一般结构

//! 说明

// Includes and external references

// Externs

// Definitions

// Prototypes

// Variables

// Code

///

// End of file

///

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值