一些我自己的代码规范
写代码的时候,代码规范确实是一个不大不小的问题。为了防止代码变成“屎山”,养成一个好的代码习惯还是十分重要的。本文就简单记录一些章鱼自己的代码规范,(不出例外的话)这些代码将会在本人的所有项目中直接复用。
实用工具
具体来讲,当我们想用到一个小工具时,比如logger,肯定会希望直接把前人(或自己)的代码拿来用。但当我们上网开始找代码准备照抄时,往往又会觉得别人写的代码总是看着不太顺眼。思考一番后,往往又会决定自己重新写一份。如果自己写的时候偷了懒,可能导致这个小工具和当前项目耦合到了一起,不利于日后复用。所以,章鱼认为有必要把平时用到的小工具都封装保存好,以后直接复用,既节省精力,又能保证代码风格一致。
logger
输出,log。这大概是一个项目中最常用的功能。格式输出,输出到文件,带着log_level输出.......这些功能每次都要写,每次都不重样。为了让代码更美观,我直接借鉴了yongchaoHe学长的代码风格,整理出了C和C++两个版本的logger,代码在logger/src
-
Usage
-
C
跟printf用法相同,直接
LOG_INFO("n = %d\n", n);
-
C++
跟cout用法相似,直接
logger << "n = " << n << endl;
也可以快捷地输出一行
logger.info("n = ", n);
-
-
Result
bash script
在编写bash脚本时,也最好采用上文的输出格式。当编写多个脚本时,可以将一些共用的函数装到一个“头文件”
里,每个脚本引用这个“头文件”即可。
在具体的项目中,脚本所在的目录在这里:
.
├── bin
├── other_folders
│ ...
└── scripts
├── other_scripts.sh
| ...
└── utils.sh
这个utils.sh就是头文件,其代码是utils.sh。
-
Usage
只需在其它文件里写
scrp_path=$(cd `dirname $0`; pwd) . ${scrp_path}/utils.sh
即可加载此头文件
命令行参数
无非就是getopt,原理大家都懂,但是每次重写一遍估计都和之前长得不太一样。为了防止重写(可以直接ctrl c+v),这里整理了C和C++两个版本,代码还是在logger/src。
-
Usage
-
C
parse_conf(argc, argv);
结果保存在全局变量
struct conf_t conf;
中 -
C++
Config cfg; cfg.parse(argc, argv);
用
Logger &logger(cfg.logger);
即可得到对logger的引用。
-
计时与等待
同样是一个令人头疼的问题。此前每次想要sleep或者gettime时,总要思考几个问题:需要包含哪些头文件?结果的格式是啥样的?于是干脆把它们封装成几个固定的函数接口好了。
-
Usage
double gettime_s(); double gettime_ms(); double gettime_us(); void sleep_s(int n_s); void sleep_ms(int n_ms); void sleep_us(int n_us);
中断
直接用Ctrl+C来终止死循环并不是一个很优美的做法。相对地,用自定义的函数处理SIGINT和SIGTERM是一个很好的习惯。
用signal
来注册一个信号处理函数。当信号处理函数捕获一个SIGINT或者SIGTERM信号时,会将一个全局的变量force_quit
设为1。而所有原本的死循环也都要不停地检测force_quit
是否为1。
代码见logger/test中的QuitTest。