代码风格外文翻译资料

 2022-06-16 09:06

英语原文共 221 页,剩余内容已隐藏,支付完成后下载完整资料


第五章

代码风格

迄今为止,我们可以看到在短的编码指令里面,没有良好的组织代码,很快就会成为一个难以管理的群体。特别是对于非作者试图辨别它是如何工作的。本章将脱离使用任何特定硬件的细节,并深入研究编码的文体和组织方面。

5-1 头和头文件

代码的这一部分包含对编译器的指令以及变量和函数声明。这些说明是必要的。

编译器如何处理整个代码中发现的某些事物,并且不是在编译代码中最终执行的。通常这些指令包含在头文件中。这些头文件用于分隔为组织执行代码的编译器指令,以及提高代码重用的可能性。当写入对应一个,特定文件包含代码,头文件将经常使用与代码文件,只使用.h(头)扩展代替.C扩展(例如)my program.h for my program.c)。

5.1.1#ifndef MY PROGRAM _H

所有的头文件应该以#ifndef语句开头。 这是一个预处理器指令(用#符号表示),它告诉预处理器检查以前是否定义了我的程序H. 如果有,则编译器跳到相应的#endif语句,该语句应该位于头文件的底部。

# define MY_PROGRAM_H }

#ifndef后面的行应该是创建MY PROGRAM H的定义并导致编译器,如果编译器尝试跳过#ifndef #endif部分的内部,在相同的程序编译中第二次编译文件,从而避免非法多次声明任何内容.如果不包含这些行的组合,并且该文件出现在其他文件中的多个#include行中,则编译器可能会抛出关于多个定义的错误。相同的功能或变量。定义的标准是使用全部大写字母的文件名,扩展名的时间段变为下划线.

5.1.2补充的内容

为了更好地组织头文件,将类似的命令组合在一起。 这些命令中的第一个是#include。 该命令告诉编译器查看另一个文件并编译它,并用于从其他文件(如库)中引入代码(请参阅本章后面的“库”一节)。 即使头文件也必须包含在这个项目的源文件中。 只要所有的头文件都用上面提到的#ifndef命令正确构建,就不用担心多次在同一个项目中包含同一个文件。 根据库的位置,有两种略有不同的#include语句。 如果库位于编译器已知的特定路径的文件夹中,例如安装了内置标准库的位置,则在库名称e周围使用尖括号。

# include lt; math .hgt;

而如果该文件位于包含当前源文件的目录中,则双引号将替换尖括号。 标准相对路径语法用于在文件夹之间导航,并可用于访问比当前目录更高级别的文件夹。

# include ' ..\ Libraries \ myFile . h”

该指令会在Libraries 文件夹的当前目录相同的父文件夹中寻找myFile.h。(请参见图5.1了解文件结构有问题)

5.1.3宏定义

编译器宏是使用结构使用#define语句创建的。

#define MACRO NAME mac

使用宏名称的所有大写字母是标准的.编译器然后通过直接替换直接替换代码中出现的任何宏名称来使用宏。这是最常用于从目标可能不明显的代码中的计算中删除数字,并将其替换为名称的。这可以提高代码的可读性,并且使得在稍后的日期更改该值更简单。如果号码出现在多个位置,则尤其如此。

例如,通过实验手段发现的两个值是作为乘数和控制函数中的偏移量所需的 然后,头文件可以包含这些行,并且这些值将用在行中的代码中,这些代码更具可读性,并且当新数据可用并且乘数和偏移更改时,宏比找到该行更容易再次更改。

# define CONTROL_MULT 0.23897

# define CONTROLOFFSET 2.348

output = ( input * CONTROL_MULT ) CONTROL_OFFSET虽然这是一个常用的用法,但这些宏也可用于替换计算,函数调用甚至整个代码块。下面是一个用于计算存储在ATmega644p特定寄存器中的值的例子,它决定了串行通信的波特率(参见USART外设章节)。

# define UBRR_VAL F_CPU /16/ BAUD -1

UBRR0 = UBRR \ _VAL;

这将根据时钟速度(FCPU)和所需的波特率计算UBRR寄存器的所需值。

重要说明:除非使用宏,否则宏不应以分号结尾。

# define DEF \ _NUM 4;

sum = DEF \ _NUM 2;

这个例子抛出一个错误“预期的标识符或#39;(#39;之前的#39; #39;标记”,因为宏将导致和编译器将解释 2;作为自己的命令,而不是作为预期的总和的一部分。

sum = 4; 2;

5.14全局变量声明

头文件中的下一部分语句是全局变量声明。这些全局变量就像本地c变量一样,只是多个函数可以通过使用extern关键字来访问它们。 还需要注意的是,初始化头文件中的全局变量可能会导致可能不容易追溯到实际源(初始化)的错误。

5.1.5函数原型

最后是函数原型。 这些承诺函数存在并且可以被调用,但是在某些源文件中实现而不是在原型出现的位置。 原型的格式与标准函数声明的格式相同,但是代替{}中包含的代码,只有分号。

int foo ( char bar );

这些原型的目的是增加功能的范围并允许其他源文件调用它们。 此外,它允许实现在源文件中以任何顺序发生。举个例子,一个带有主函数的程序调用了函数foo并且没有函数原型。如果主函数在foo之前(在文件之前)被实现,那么将会抛出未声明的错误#39;foo#39;(首次在这个函数中使用).如果首先执行foo,或者包含函数原型,则不会抛出错误。

5.2注释

注释是程序的重要组成部分,它并不是改变代码在机器上运行的方式,而是用于其他人的维护和使用。有人建议每行包含代码的行应该被注释,其他人则是注释较少的支持者,但仍然有更多的注释行比没有注释的行更有说服力。所需注释的数量和风格取决于项目负责人(通常是经理,编写代码的人的老板)和代码的复杂程度。编写完好的代码将需要更少的注释,因为代码更加自我解释,然而,一个好的经验法则是,读者应该能够通过单独阅读注释来理解代码在做什么,以及它是如何做到的。

5.2.1文档注解

文档注解是注解块,其目的是为程序创建文档。当正确的格式化程序如Doxygen会自动将这些注释拉出来并形成一个很好的文档。

Doxygen标准与Javadoc非常相似,无论是在将注释块声明为文档还是在用于标记某些信息的标签系统中。许多重要的信息包含在文档中的关键字被称为标签,位于注释块中的信息之前 这些标签包括简短的,返回,参数和文件,并且前面有一个\或一个@符号。 两者都可以工作,但最好选择其中一种,并坚持在任何程序中以保持一致性。

关于如何使用注释块和注释行样式将注释标记为文档有几种变化。 注释块最常用的方法是,因为它也是Javadoc使用的方法,用第二个星号开始注释块。 通常每行都会以星号开头,以提高代码的可视性。利用注释行的另一种方法是创建至少两行长的注释块,并以额外/。

/* *

* This is a documentation comment*/

/*

This is not*/

gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;gt;

// /

// / This is a documentation comment// /

文件文档注解

每个文件应以文档注释块开头。该块应该包含文件中包含的内容,创建或修改日期以及作者姓名的描述。通常情况下,文件注释中也会包含更改日志或版本历史记录。有关可用标签的完整列表,请参见www.doxygen.com [4]。以下是源文件mainfile.c的文件文档示例。

/* *

* \ file mainfile . c

* \ author Peter Alley

* \ date 7 JUL 2009

* \ version 2.3

*

* \ Section

* Here we have a description of the file . As this is

* just a demo and the file doesn ✬t contain anything ,

* this is just a dummy description .

* \ Section

* By the way , there can be multiple sections .*/

宏和全局变量注释

每个已定义的宏和全局变量都需要进行注释。这将有助于跟踪哪些符号已被使用以及它们已被用于什么。这些注释的标签倾向于相当自我解释,def标签用于定义的宏,struct用于结构,typedef用于定义的变量类型,var用于变量声明。同样,这些标签的完整列表可以在www.doxygen.com找到[4】.

/* *

* \ def ADC_CHANNEL* Channel to use on ADC

*/

# define ADC_CHANNEL

功能文档注释

也许最重要和最有用的文档注释是针对单个功能的。 这些可以出现在头文件中的函数原型中,也可以在源文件中实现,或者同时出现在两者中。 并包含函数的描述以及每个输入参数应该是什么以及函数返回的内容。 在多作者文件中,可能还有作者标签。

这些是一些最常用的功能标签,以及它们如何使用。

brief:以下应该是一个简短的,一到两个句子的解释功能。 如果需要或需要更深入的解释,请将详细说明放在注释块的末尾,并用空行将它与上面的标签分开。

param:这个标签有两个只由空格分隔的参数。 第一个参数是所讨论参数的名称,第二个参数是对函数期望的信息的描述。

return:这个标签指示了函数返回值的简单解释。 如果函数的返回类型为void,则不需要包含此标记。

/* *

* \ brief This is a function that subtracts the first* argument from the second

* \ param param1 The number to be subtracted from

* \ param param2 The number to subtra

* \ return The result of the subtraction problem

** This is the place to include a longer description of

* the function as necessary , though in this case it is

* hardly required due to the simplicity of the function .*/

float subtract ( float param1 , float param2 ) {return param1 - param2 ;

}

5.2.2非文件注解

虽然文档注释的目的是解释代码的作用,但不适用于文档的注释涵盖了代码的工作原理。 这些注释对未来试图维护代码的程序员非常有用。每一条注释都会为他们提供更多信息,并使他们的工作更轻松。这些是注释非常有用的几种情况。

具有复杂逻辑的行。只要有逻辑检查包括一个或两个以上的操作,建议包括一个注释,用英语指出哪些情况会导致真实结果。

条件块的开始。每当代码段可能执行或不执行时,都应该包含解释代码块及其运行时间的注释。

循环的开始。当进入循环(while,do-while等)时,描述循环完成的内容以及循环的时间是很有用的。如果循环设置为循环设置次数,则应该包括该数字的原因。

任何具有非显而易见的结果或原因的行。如果单行或甚至是行集合的结果不易理解,无论是原因,过程还是结果, 应该包括在内。

逻辑上分离的代码块。任何时候都会完成一个给定的任务,并在代码中开始一个新任务。每个任务都应该在开始时进行注释,简要说明该部分的作用。这可能是诸如“ 初始化“或”计算电机扭矩“。在程序的某个部分发现问题,这些是第一次检查的注释,以找到正确的代码部分。

这些决不是注释的唯一地方。任何时候程序员都想要一个注释,无论是写下他的思维过程,理解一个想法,展示伪代码,还是暂时从代码中删除代码,注释都可以被包括在内。如果对注释的有用性或必要性有疑问请将其纳入思考:某个人,某一天可能会觉得它有用。

5.3代码再使用:函数和库

提高编码速度和准确性的最佳方法之一是重用代码。通过从先前编写的程序或同一程序的各个部分获取代码,可以更容易地确保正确的操作,并且无需重新编写和调试代码即可节省时间。本节介绍使用函数和函数库来达到这个目的。

5.3.1何时使用重用功能

函数的主要目的是允许在一个程序的多个位置使用同一段代码。 尽管在主要功能中编写完

全文共17881字,剩余内容已隐藏,支付完成后下载完整资料


资料编号:[10909],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。