好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

c语言优秀编程风格.doc

10页
  • 卖家[上传人]:xzh****18
  • 文档编号:41213701
  • 上传时间:2018-05-28
  • 文档格式:DOC
  • 文档大小:40KB
  • / 10 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 作为一个初学者如何具有良好的程序设计风格呢?我想引用一个关于初学者请教编程大师的故事让读者自己去领悟有一位编程大师,他写非结构化的程序,一位初学者刻意模仿他,也写非结构化的程序当他让大师看他的进步时,大师批评了他的非结构化程序:“ 对一位编程大师合适的东西未必对一个初学者同样合适,在超越结构化之前,你必须理解编程之道 我个人认为作为一个初学者应该踏踏实实的打好程序设计的基础,不要急功近利,舍本逐末我走过不少弯路,希望大家能和我一样能牢记编程大师的忠告:“对编程大师合适的东西未必对一个初学者同样合适”本文所描述的优秀编程风格适合于大部分语言,文章中可能提到你不是很了解的概念,没有关系,你放心的读下去,当你使用 AVR 一个月之后,你什么都明白了AVR c 语言优秀编程风格文件结构模块化的程序应该是有一个很好的程序结构的AVR C 语言程序有两种用户文件,.c 程序文件,.h 头文件,程序中编写过程中需要在.c 文件中包含.h 头文件初学者往往出现重复包含或者头文件包含错误的问题,我当时也时常为这种错误而发愁下面我以我写的电机驱动例程来给大家说明一下,优秀的编程文件结构这个工程中有 8 个文件,一个说明文件,如下图:下载程序例子 电机控制案例 。

      文件结构我写的成型的程序的文件个数基本上都是偶数,因为每一个结构化的函数定义.c 文件都会对应一个.h 文件main.c 对应 config.h我们来看看各文件的包含关系下面我们看看这些文件的包含关系与内容:[推荐的文件包含顺序与关系]* 所有.c 文件都包含了 config.h 文件如: #include “config.h“* 在 config.h 中有如下代码:#include “delay.h“#include “device_init.h“#include “motor.h“* 这样做就不容易出现错误的包含关系,为了预防万一,我们还引入了宏定义与预编译如下:#ifndef _UNIT_H__#define _UNIT_H__ 1 //100usextern void Delay100us(uint8 n);//1sextern void Delay1s(uint16 n); // n #endif#if CPU_TYPE == M64#include #endif#if CPU_TYPE == M32#include #endif#if CPU_TYPE == M16#include #endif#if CPU_TYPE == M8#include #endif* #include 与 #include “filename“ 的区别 :前者是包含系统目录include 下 的文件,后者是包含程序目录下的文件。

      变量名与函数名变量以及函数命名应该按照尽量短,按需长,具有实际意义可以通过下划线或者大小写结合的方法组合动词和名词组成变量函数名下面对比好的命名方法与不好的命名方法:1. 好的: Delay100us();不好的: Yanshi();2. 好的: init_devices();不好的: Chengxuchushihua();3. 好的: int temp;不好的: int dd;外部调用1. 首先在模块化程序的.h 文件中定义 extern//端口初始化extern void port_init(void);//T2 初始化void timer2_init(void);//各种参数初始化extern void init_devices(void);2. 模块化程序的.c 文件中定义函数,不要在模块化的程序中调用程序,及不要出现向 timer2_init();这样函数的使用,因为你以后不知道你到底什么地方调用了函数,导致程序调试难度增加可以在定义函数的过程中调用其他函数作为函数体/**************************采用 timer2 产生波形***********************/// PWM 频率 = 系统时钟频率/(分频系数*2*计数器上限值)) void timer2_init(void){TCCR2 = 0x00; //stopTCNT2= 0x01; //set countOCR2 = 0x66; //set compareTCCR2 = (1b)?(a):(b))#define ABS(x) ((x>)?(x):(-x))typedef unsigned char uint8; /* 定义可移植的无符号 8 位整数关键字 */typedef signed char int8; /* 定义可移植的有符号8 位整数关键字 */typedef unsigned int uint16; /* 定义可移植的无符号 16 位整数关键字 */typedef signed int int16; /* 定义可移植的有符号16 位整数关键字 */typedef unsigned long uint32; /* 定义可移植的无符号 32 位整数关键字 */typedef signed long int32; /* 定义可移植的有符号32 位整数关键字 */2. 二是利用宏定义方便的进行硬件接口操作,再程序需要修改时,只需要修改宏定义即可,而不需要满篇去找命令行,进行修改。

      //PD4,PD5 电机方向控制 如果更改管脚控制电机方向,更改 PORTD |= 0x10 即可define moto_en1 PORTD |= 0x10#define moto_en2 PORTD |= 0x20#define moto_uen1 PORTD // 将数据加入到发送缓冲区并开中断extern void Delay1s(uint16 n); // n <= 6 ,when n==7, it is 1. 2. 在模块化的函数中使用详细段落注释:/************************* 函数名称: Com_putchar** 功能描述: 从串行口输出一个字符 c** 输 入: c:输出字符** 输出 : 0:失败 1:成功** 全局变量: 无** 调用模块: ** 说明:** 注意:********************/3. 在文件头上加文件名,文件用途,作者,日期等信息/*********************************************************************************************************** serial driver ** (c) Copyright 2005-2006, limaokui** All Rights Reserved**** V1.1.0******--------------文件信息--------------------------------------------------------------------------------**文 件 名:sio.c**创 建 人: 李茂奎**最后修改日期: 2005 年 7 月 13 日**描 述: serial driver ****--------------历史版本信息----------------------------------------------------------------------------** 创建人: 李茂奎** 版 本: V1.00** 日 期: 2005 年 7 月 13 日** 描 述: 原始版本** *********************************************************************************************************/要清楚,注释是为了方便阅读,增强程序的可度性,不要本末倒置,不要给很简单大家都能看明白的程序加注释,不要让注释淹没了你的程序结构。

      对于函数,变量等尽量使用文件名自注释的方法,及通过文件名就可以知道意思。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.