读书人

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

发布时间: 2012-06-03 16:59:40 作者: rapoo

关于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);} 

读书人网 >C语言

热点推荐