关于C语言中宏定义的一个疑问,该如何解决
关于C语言中宏定义的一个疑问
以前对宏实际使用得比较少,只是定义一下常量之类的,但是最近看《TCP/IP协议卷二》的时候发现里面有这样的用法:
也就是说通过宏定义屏蔽了一个函数的函数调用。我以前从来没想过宏还可以这样用,于是自己写一个小程序试了一下,结果如下:
输出结果为
9
9
0
9
我的疑问是为什么第二个输出不是0呢?应该如何修改才让第二个的输出也为0呢?
谢谢大家!
------解决方案--------------------
宏不涉及到运行时抉择,不涉及递归嵌套等。楼主还是打开编译器生成预处理文件。然后仔细看看把。我的VS08生成的预编译文件是:
以前对宏实际使用得比较少,只是定义一下常量之类的,但是最近看《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); }