过马路 左右看,过马路,左右看
【 tulaoshi.com - C语言心得技巧 】
过马路,左右看
作者:乾坤一笑
#define NUM_A 100#define NUM_B 25 * 2#define int_div(a, b) a / bfloat 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.hint 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)
来源:http://www.tulaoshi.com/n/20160129/1486145.html