C/C++编码技巧

声明:其中有些内容并不是本人原创,而是学习的别人的经验,或者是从书上看到的总结在此,既然拿出来共享,本人不再区分本人原创部分,而且有些技巧已经是众所周知,或者已经用了很长时间了,也弄不清出处了,这些对原创者一并给予感谢!

1. char str[20]
char* cp = &(str[2]);
这样比使用
char* cp = str+2;
要好,因为后编译器容易编译成加法指令,而上面这种方法编译器很容易优化,把str[2]解释为常量传给cp

2.短路径优先返回原则:如 if/else块包含return语句时,把包含return的块放在前面,去掉else, 如:

if(i>3){
// process block
}
else{
printf("parameter error!");
return -1;
}

改为

if( i<=3){
printf("parameter error!");
return -1;
}
// process block

这样可以减小{ }的嵌套深度,使代码更容易阅读。如果if和else块中都有程序块进行正常的处理,没有返回语句,要把较小的块放到前面,使代码没有头重脚轻的感觉。如果if/else语句中包含错误处理块,把错误处理块放到前面,以强调事务处理中的特殊情况,如果这样会使条件判断的复杂度提升,则可以不采用本规则。

3. 多行宏定义。使用do/while定义包含多行程序的宏如

#define increase_var(var) do{var +=1; var+=2; var+=3;}while(0)

4. 长表达式换行。当表达式太长或参数表太长需要换行时将运算符放到下行行首,而不是上一行尾。如

if( the_first_value
|| the_second_value
)
而不是
if(the_first_value ||
the_second_value)

function(argument_1
, argument_2
, argument_3
)
而不是
function(argument_1,
argument_2,
argument_3)

第一种格式中,如果想要注释掉条件表达式的一部分或者函数参数的某个参数时,只需要将某一行注释旧即可,非常方便。

5. 在==表达式中,将常量放到左端,例如:

int i=2;
if( 3 == i){ //......
}

这样就能够避免由于少输入一个等号“=”,造成程序错误,因为如果把 3==i 错写成 3=i 编译器会直接报错。

6.在不需要返回值的函数调用前加(void)以表示该函数不返回任何值,以提高可读性,如:

void myfunc(int arg)
{ // do something
}
void main(void)
{
...
(void)myfunc(20);
...
}

7.在帮助中使用argv[0]输出命令名称,不要使用硬编码。如:不要使用

printf("usage: commandName -u -v");

而要使用

printf("usage: %s -u -v", argv[0]);

这样即使用户将程序改名,或者以后改名,帮助仍然会输出正确的命令,而无而修改程序。

8.注释技巧。如:
//* block beginning
... block here
// block end */

这里的block是参加编译的代码,如果在调试的时候想把该块注释掉,只需要删除第一行前面的一个"/",因为上面的程序代码中编译器先解析第一行,发现有两个"/",则该行都被视为注释,不再解析后面的*,最后一行同理,所以首尾两行都被解析为行注释,而代码可以被编译。如果去掉最前面的一个"/",编译器解析时先解析到/* ,所以会认为是块注释,便等待一个 */ ,其中的部分都被视为注释,即直到最后一行的*/都被视为注释,所以程序块不会被编译。这在调试程序时比较有用,切换比较快。其实,现在SoureInsignt, Keil C51, Visual Studio, Borland C++等编译器都支持选择一块程序,使用菜单命令自动添加//,这个技巧好像不是太有用,但对于其它编辑器可能还是有用的。6

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页