【持续更新】养成一些好的C++编程习惯,争做一个不让同事骂街的程序员
最近回顾了一下自己的代码,发现可阅读性真的很低,这需要一开始就养成敲代码的好习惯,可是自己去年刚入行的时候也没好好在意,导致现在代码越来越不规范,让同事很困扰,现在开个贴记录下自己觉得有必要在意的代码习惯,以帮助自己经常回顾,也帮助一些新人能少像我一样走些歪路。
1.少用using namespace,大型工程项目里应该就不要用,刚入门时很多示例代码都会把using namespace std;加上去,确实代码书写起来更方便了,string啊cout这些常用的不用再加std了,这么一看很方便,但是大型工程项目里不光std一个namespace,也可能有opencv里的cv啊,虽然这两个没啥交集,不用太在意,但是万一有些三方库使用了和另外一个三方库一个不同命名空间,但是同一个类名呢,这时候都用using namespace,省了点力,但是代码怎么知道这是哪个命名空间里的类。这种情况很少有可能出现,但更重要的是同事阅读你代码的时候,很头疼,尤其是命名空间多了,不知道哪个对哪个,所以珍爱同事的脑子,少用using namespace。
当然有一个更稳妥的办法是using命名空间中指定的内容,如下:
#include <iostream> //using namespace std; using std::cout; int main() { cout << "Hello World!"; return 0; }
当然,如果你很清楚你的程序不会因为namespace产生问题时,请放心书写using namespace xxx语句。毕竟繁琐地书写诸如 using std::out 或者 std::cout 的代码都比较麻烦。简洁的代码带来的是高效的开发效率。
2.重视自己对于代码里对象或者方法的命名。对于对象命名,类内m_开头,全局g_开头,例如CButton *m_btnOk。最好能根据下表,在m_和对象名之间加上对象的类型简写作为前缀,就像刚才的示例btn。对于类或者结构体命名,类就C打头,结构体就S打头,第一个单词一般必须大写,多个单词,每个首字母必须大写。对于常量,一个单词的常量需要所有字母大写,多个单词所有字母大写,中间由_隔开 如:PI 、STUDENT_MAX_AGE。
前缀 |
数据类型 |
示例 |
b |
boolean(布尔型) |
bool bIsupper; |
c |
char(字符型) |
char cLetter; |
str |
string(字符串) |
string strName; |
n, i |
int(整型) |
int nAge, iNum; |
si |
short int(短整型) |
short siSequ; |
l |
long int(长整型) |
long lID_card; |
f |
float(浮点型) |
float fRadius; |
d |
double(双精度型) |
double dArea; |
ld |
long double(长双精度型) |
long double ldRate; |
sz |
以’\0’结束的字符串 |
char *szAppName=”WinAPI”; |
h |
句柄 |
HINSTANCE hInstance; |
if |
输入文件流 |
ifstream ifDateFile; |
of |
输出文件流 |
ofstream ofStuFile; |
S |
结构 |
Struct Saddress; |
C |
类 |
Class CnewView; |
u |
无符号的 |
unsigned int uCard; |
s |
静态的 |
static int siInst_ID; |
3.声明独占一行,避免一行多个声明变量,这个我不经常犯,但我的同事经常喜欢一行多个声明,写起来方便。当你可能需要为每一个变量都添加注释时,这样写就有好处了。
int main() { int a; int b; int c; /* *尽量避免以下的声明方式: *int a,b,c; *或者 *int a;int b;int c; */ return 0; }
4.多行注释:注释内的每一行都以一个星号*开头,指出整个范围都是多行注释的一部分。这个在看同事代码的时候发现的,确实很舒服
#include <iostream> using namespace std; /* *主函数作用: *打印Hello World字符串 */ int main() { cout << "Hello World!"; return 0; }
5.函数体的左右花括号独占一行,尽量别简写省略了一些花括号,代码缩进规范。这个我基本没犯过,因为我有一定的代码强迫症,少写花括号我的脑瓜子就疼,看到别人的代码少写,就手痒想把它加上去。
6.在大型工程项目中善用宏定义,方便后期删除一些功能,只要屏蔽一些宏定义就行了,不至于大动手脚。还有头文件申明部分最好用#ifndef ... #define ... #endif,防止头文件被重复引用造成重复定义,虽然VS上有 #pragma once这个宏定义了,但是还是要养成这样的好像习惯,避免以后脱离了一个编辑器以后发现自己不会敲代码了,怎么敲怎么错,至少目前我就是这样的。
#ifndef CTEST #define CTEST ..... #endif
推荐阅读:https://blog.csdn.net/q191201771/article/details/6399820,这里面就讲的很详细了,从预编译和链接的角度回应了重复定义这个问题
7.代码里的所有地址还有引用最好用相对路径,这个我要diss一下我目前的这个项目,接手之后才发现地址用的是绝对路径,导致我的代码必须得放到那个路径才能运行,虽然能改,但是工作量太大了,最好一开始就能注意,切忌使用绝对路径。
8.仅在某个变量需要准备首次用到时,才去定义声明该变量,而不要程序开头就堆砌一大团变量的定义声明语句。不然同事就要骂爹了,看到一个地方就要回到开头看下这个变量的申明。
9.绝大部分情况下,形参可以尽量使用引用,这不光方便,还对执行效率的提高是有益的。
推荐阅读:https://blog.csdn.net/weixin_41256281/article/details/90545595 主要讲解了引用传参和指针传参的区别,我相信目前大多数新人也是纠结到底要用这两个的哪个,而不是用值传参
10.活用extern,static,const等关键词修饰自己定义的对象。
const修饰右边的类型不可变,比如const int *p,修饰的是指针p指向的值不可变,又如int* const p修饰的指针p不可变,根据 const 位于 * 号的位置不同,总结三句话便于记忆的话:"左定值,右定向,const修饰不变量"。
static修饰的对象方法都是静态的,何为静态展开讲的篇幅太大,可以参见https://blog.csdn.net/ypshowm/article/details/89030194这篇文章。
extern修饰的对象或者函数方法都只是申明,他只是告诉当前文件这个方法或者对象在其他文件里有定义或者声明,比较拟人化的讲就是看到extern,其实就相当于告诉你这个东西你别管我要,我也不知道他在哪,我只知道他的申明,你只要知道有这么个东西,知道他怎么用就行了,当然你如果用extern修饰了一个对象或者方法,那么一定要在其他地方申明他,不然程序还是会在链接阶段报错的