读高质量C++/C编程指南1-3章

Posted TangguTae

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读高质量C++/C编程指南1-3章相关的知识,希望对你有一定的参考价值。

目录

第一章 文件结构

 版权和版本的声明

头文件的结构

头文件的作用

目录结构

第二章 程序的板式

第三章 命名规则

总结


第一章 文件结构

 版权和版本的声明

这个在以后工作,对每个文件进行版权版本的声明,是规范开发项目的一个重要的组成部分。

主要包含以下信息:

(1)版权信息

(2)文件名称,标识符,摘要。

(3)当前版本号,作者/修改者,完成日期。

(4)版本历史信息。

头文件的结构

除了版权和版本声明以外,还包括预处理块、函数和类结构的声明

预处理块在之前的C语言预处理_TangguTae的博客-CSDN博客有讲过一部分这方面的知识。

为了防止头文件的重复引用,应当用ifndef/define/endif等预处理指令产生预处理块。

延伸:

现在大多数用#program once来防止重复包含头文件,这两种方法都可以实现这种功能,但是这两者的区别是什么?

#pragma once 此方式由编译器保证同一个文件不会被包含多次。注意:这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。这个跟编译器有关,所以在这个编译系统上可行,可能在其他编译环境就不行,可移植性差。

#ifndef #define #endif这个是通过C语言中的宏定义实现的,通过宏定义避免文件多次编译。所以这种方式只要是支持C++/C语言的编译器都可以使用,可移植性强。

从性能上看:

#program once效率更高一点

从灵活性上看:

#ifndef #define #endif更灵活一点,因为#program once作用对象是整个文件,而#ifndef #define #endif可以针对部分语句。

还有可能犯一个细节的错误,#ifndef ***可能后面的语句可能会写错。

建议:

  • 文件最好只存放声明而不存放定义
  • 最好不要声明全局变量,避免在头文件中存在extern int value这类声明

头文件的包含

#include<>与#include" "的区别

#include<>:编译器从标准库路径开始搜索,用来引用标准库的头文件。

#include" ":编译器从用户的工作路径开始搜索,用来引用非标准库的头文件。

头文件的作用

  • 通过头文件来调用库功能。
  • 头文件能加强类型安全检查。(当声明与定义不一致的时候,编译器会指出错误)

目录结构

当项目比较庞大的时候,头文件和源文件会非常的多,此时需要对项目中的文件进行管理,通常将头文件和源文件分别放在不同的目录下面,便于维护。


第二章 程序的板式

非常重要!!!

虽然不会影响代码的正常运行,但会影响到代码的可读性。

主要注意以下几个方面

  1. 空行
  2. 空格
  3. 对齐
  4. 长行拆分
  5. 修饰符的位置
  6. 注释
  7. 类的版式

空行使用的得体会让程序的布局显得很清晰,如果把代码写的密密麻麻的应该没有人想读你的代码

// 空行
void Function1(⋯)

⋯

// 空行
void Function2(⋯)

⋯

// 空行
void Function3(⋯)

⋯

空格的使用和空行是一样的道理,让代码更清晰。现在的编译器例如VS可以控制代码的格式,会使得程序员更舒服,但是这种编程习惯还是的养成。

void Func1(int x, int y, int z); // 良好的风格
void Func1 (int x,int y,int z); // 不良的风格

if (year >= 2000) // 良好的风格
if(year>=2000) // 不良的风格
if ((a>=b) && (c<=d)) // 良好的风格
if(a>=b&&c<=d) // 不良的风格

for (i=0; i<10; i++) // 良好的风格
for(i=0;i<10;i++) // 不良的风格
for (i = 0; i < 10; i ++) // 过多的空格

x = a < b ? a : b; // 良好的风格
x=a<b?a:b; // 不好的风格、

int *x = &y; // 良好的风格
int * x = & y; // 不良的风格

array[5] = 0; // 不要写成 array [ 5 ] = 0;
a.Function(); // 不要写成 a . Function();
b->Function(); // 不要写成 b -> Function();

对齐最简单的就是括号的对齐了

'' 和 ''独占一行并且位于同一列,层次更加清晰。

长行的拆分主要是控制一行代码不要太长,不然看起来会很累,并且不利于打印。

规则:长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。

if ((very_longer_variable1 >= very_longer_variable12)
&& (very_longer_variable3 <= very_longer_variable14)
&& (very_longer_variable5 <= very_longer_variable16))

    dosomething();

修饰符的位置

这个主要集中在*和&两个操作符是应该靠近类型还是变量名。

这个我觉得还是看个人吧,书上说的是靠近变量名,我本人其实挺喜欢靠近类型的,比较直观,至于书上说的问题例如int* x, y,y容易被误解成指针,既然这样直接分开定义吧。

注释

这个可太重要了,如果写的代码通篇一个注释都没有的话,我相信过不了多久你回过来看自己之前写的代码,很大概率你是看不懂的,黑人问号一脸懵逼。 

注释的使用也有一定的要求:

  • 注释是对代码的提示,而不是文档,注释不用很多,但是一定要精,在函数接口、重要的代码行或段落进行提示。
  • 注释应当准确、易懂、清晰。
  • 不要有缩写
  • 注释的位置与被描述的代码相邻,上方或者右方,不要下方。

类的版式 

类的版式主要有两种方式:

  1. 将private 类型的数据写在前面,而将public 类型的函数写在后面
  2. 将public 类型的函数写在前面,而将private 类型的数据写在后面

前者以数据为中心,注重内部结构;后者以行为为中心,注重接口。

总结:

程序不规范,同事两行泪


第三章 命名规则

良好的命名规则也是每个程序员必备的编程素养。

命名规则没有最好的,只存在一些共性的规则

  • 标识符应当直观且可以拼读。例如MaxValue,一眼看去就知道是最大值,不必进行解码。
  • 符合最短长度&&最大信息原则。并不是说名字越长越好,熟悉常用的缩写,用最短的长度表达最大的信息,有些时候i,j,k等一些命名也可以用,用在函数内的局部变量会很方便。
  • 命名规则尽量与所采用的操作系统或开发工具的风格保持一致。Windows下采用大小写混排的方式,例如MaxValue,而Unix下采用下划线的方式,例如max_value。
  • 不要仅靠大小写区分标识符。例如int x, X,x和X容易混淆
  • 局部变量与全局变量不要重名
  • 变量名采用名词或者形容词+名词的形式,函数采用动词的形式。

总结

前几章主要讲的都是一些规范的问题,看起来和敲代码没什么关系,然而这正是那些刚学编程的人们最容易不注意的地方,容易培养出不好的编程习惯,所以提前学习编程规范不仅仅形成良好的编程风格,而且对以后团体协作也有很大的帮助。

以上是关于读高质量C++/C编程指南1-3章的主要内容,如果未能解决你的问题,请参考以下文章

读高质量C++/C编程指南第5章

读高质量C++/C编程指南第6章

读高质量C++/C编程指南第4章

C++内存管理 && 读高质量C++/C编程指南第7章

Linux操作系统-进程控制

《代码大全》读书笔记——week4