VC编程-过马路,左右看
2007-03-15 21:53:16 来源:WEB开发网核心提示: 其实软件开发的时候也有很多口诀,即便是不明白道理,VC编程-过马路,左右看(2),但是照着做,总没错,我只是觉得函数定义和声明的概念比变量定义和声明的概念容易描述清楚才举这个例子,其实对于出“函数定义写在.h中”的错还真不多见;不过把数组定义和初始化写在.h文件中可
其实软件开发的时候也有很多口诀,即便是不明白道理,但是照着做,总没错。如果不照着做,没准还真就捅了篓子,或者在代码中埋下了一时难以出现的隐患。下面就举一个C中的应用口诀的例子(C++我不懂,就不献丑拉。~)
比如,有个口诀叫做“定义宏常量或宏公式的时候,一定要加圆括号”,有很多人就不理解,于是他们就不加,结果就出了类似于如下的问题:
#define NUM_A 100
#define NUM_B 25 * 2
#define int_div(a, b) a / b
float c;
c = int_div(NUM_B, NUM_A); //作者原意是 50/100,实际结果是 25 * 2 / 100, 结果没错
c = int_div(NUM_A, NUM_B); //作者原意是 100/50,实际结果是 100 / 25 * 2,结果错了。
试想,如果我们就按照口诀来操作:
#define NUM_A (100)
#define NUM_B (25 * 2)
#define int_div(a, b) ( (a) / (b) )
又怎么会出错呢? 再举个例子,比如有个口诀叫做“头文件里面只声明不定义”。如果不照这个口诀操作,也会出问题。比如://a.h
int max(int a, int b)
{
return a>b?a:b;
}
//main.c
#include "a.h"
#include "a.h" //include 两遍后就会重复定义max(),结果出重复定义的错。
int main()
{
return 0;
}
你肯能会说,我在.h里面加点料儿,保证它不重复定义,比如://a.h
#ifndef _A_H_
#define _A_H_
int max(int a, int b)
{
return a>b?a:b;
}
#endif //_A_H_
Okey,现在上面那个case确实搞定了(注2)。但是下面这个就又不行了://a.h
#ifndef _A_H_
#define _A_H_
int max(int a, int b)
{
return a>b?a:b;
}
#endif //_A_H_
//b.h
#ifndef _B_H_
#define _B_H_
void foo();
#endif //_B_H_
//b.c
#include "a.h"
void foo()
{
max(100, 200);
}
//c.h
#ifndef _C_H_
#define _C_H_
void bar();
#endif //_C_H_
//c.c
#include "a.h"
void bar ()
{
max(300, 400);
}
//main.c
#include "b.h"
#include "c.h"
int main()
{
foo();
bar();
return 0;
}
分开编译b.c、c.c和main.c都还可以通过,但是最后一link就玩儿完,因为max()被定义了两遍。所以如果max()的定义放在a.c文件里,而在a.h中只写max()的声明就不会有这个问题了。(注3)综上所述,我想说的是:如果能通透理解口诀的含义那是最好(达到了心中有剑、见招拆招的境界,每招虽无口诀的形但是却暗含了口诀的神),如果不能通透理解,不妨先照着口诀做,而不是总跟前人总结口诀对着干,真是“不听老人言,吃亏在眼前”。做的多了,也就慢慢悟了,可以细细琢磨口诀的真正含义,总结口诀应用的场景,从而达到避开“听了老人言,吃亏在后面”的境界了!:p 这就是否定之否定么?我瞎说的。^_^
when going across the road, look right then left! :p
更多精彩
赞助商链接