关于C语言中宏定义的一个疑问,该如何解决

关于C语言中宏定义的一个疑问
以前对宏实际使用得比较少,只是定义一下常量之类的,但是最近看《TCP/IP协议卷二》的时候发现里面有这样的用法:
C/C++ code

#define MGET(m , how , type) { \ 
 ......... // 中间省略
else   \
(m) = m_retry((how) , (type));  \
}

struct mbuf *
m_retry(i , t)
int        i , t
{
      struct  mbuf * m;
      m_reclaim();
#define m_retry(i,t)   (struct mbuf *)0
    MGET(m , i , t);
#undef m_retry
     return (m);  
}



也就是说通过宏定义屏蔽了一个函数的函数调用。我以前从来没想过宏还可以这样用,于是自己写一个小程序试了一下,结果如下:
C/C++ code

#include <stdio.h>

int sum(int a, int b)
{
    return a+b;
}

int getsum(int a, int b);

int main()
{
    int a = 5 , b = 4;
    printf("%d\n",getsum(a,b));
#define sum(a,b) 0
    printf("%d\n",getsum(a,b));
    printf("%d\n",sum(a,b));
#undef sum
    printf("%d\n",getsum(a,b));
    return 0;
}
int getsum(int a, int b)
{
    return sum(a,b);
}


输出结果为
9
9
0
9
我的疑问是为什么第二个输出不是0呢?应该如何修改才让第二个的输出也为0呢?
谢谢大家!

------解决方案--------------------
宏不涉及到运行时抉择,不涉及递归嵌套等。楼主还是打开编译器生成预处理文件。然后仔细看看把。我的VS08生成的预编译文件是:
C/C++ code

int sum(int a, int b)
{
    return a+b;
}

int getsum(int a, int b);

int main()
{
    int a = 5 , b = 4;
    printf("%d\n",getsum(a,b));

    printf("%d\n",getsum(a,b));
    printf("%d\n",0);

    printf("%d\n",getsum(a,b));
    return 0;
}
int getsum(int a, int b)
{
    return sum(a,b);
}