免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5148 | 回复: 14
打印 上一主题 下一主题

这样的#define和enum是什么意图? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-16 17:11 |只看该作者 |倒序浏览
在/usr/include下的头文件里有很多类似


  1.     enum{
  2.         X=1,
  3. #define X X
  4.         y=2,
  5. #define Y Y
  6.     };
复制代码


的代码,不知道里面有什么奥妙?

论坛徽章:
0
2 [报告]
发表于 2005-11-16 17:13 |只看该作者
感觉还是开关那.顶.

论坛徽章:
0
3 [报告]
发表于 2005-11-16 17:16 |只看该作者
能否给个具体例子?

论坛徽章:
0
4 [报告]
发表于 2005-11-16 17:26 |只看该作者

  1. /* Types of sockets.  */
  2. enum __socket_type
  3. {
  4.   SOCK_STREAM = 1,      /* Sequenced, reliable, connection-based
  5.                    byte streams.  */
  6. #define SOCK_STREAM SOCK_STREAM
  7.   SOCK_DGRAM = 2,       /* Connectionless, unreliable datagrams
  8.                    of fixed maximum length.  */
  9. #define SOCK_DGRAM SOCK_DGRAM
  10.   SOCK_RAW = 3,         /* Raw protocol interface.  */
  11. #define SOCK_RAW SOCK_RAW
  12.   SOCK_RDM = 4,         /* Reliably-delivered messages.  */
  13. #define SOCK_RDM SOCK_RDM
  14.   SOCK_SEQPACKET = 5,       /* Sequenced, reliable, connection-based,
  15.                    datagrams of fixed maximum length.  */
  16. #define SOCK_SEQPACKET SOCK_SEQPACKET
  17.   SOCK_PACKET = 10      /* Linux specific way of getting packets
  18.                    at the dev level.  For writing rarp and
  19.                    other similar things on the user level. */
  20. #define SOCK_PACKET SOCK_PACKET
  21. };
复制代码


这个是/usr/include/bits/socket.h里面的一段...



  1. note:~/C# cat b.c
  2. #include <stdio.h>

  3. int main ()
  4. {
  5.         enum{
  6.                 X=1,
  7. #define X X
  8.                 y=2,
  9. #define Y Y
  10.         };

  11.         X;
  12.         printf("%dn",X);
  13.   return 0;
  14. }
  15. note:~/C# gcc -E b.c |tail
  16.   X=1,

  17.   y=2,

  18. };

  19. X;
  20. printf("%dn",X);
  21.   return 0;
  22. }
  23. note:~/C#
复制代码


发现也并没有用到#define,想知道什么情况下需要这么写...

论坛徽章:
0
5 [报告]
发表于 2005-11-16 17:42 |只看该作者
我也不懂……

论坛徽章:
0
6 [报告]
发表于 2005-11-16 18:13 |只看该作者
转换成常量吧?



int main ()
{
        enum{
                X=1,
#define X X
                y=2,
#define Y Y
        };

是不是 Y=2呢?
写错了还是他本来就带的?

论坛徽章:
0
7 [报告]
发表于 2005-11-16 18:37 |只看该作者
有道理,up

论坛徽章:
0
8 [报告]
发表于 2005-11-16 19:07 |只看该作者
y是打错了。


  1. #include <stdio.h>

  2. int main ()
  3. {
  4.     enum{
  5.         X=1,
  6. #define X X
  7.         Y=2,
  8. #define Y Y
  9.     };

  10. //执行,但如果只是用来功能判断的话 觉得直接#define X也就够了
  11. #ifdef X  
  12.     printf("%dn",X);
  13. #endif

  14. //不被执行,看来#define Y Y 的后一个Y也没用enum里面的Y的值
  15. #if Y==2  
  16.     printf("%dn",Y);
  17. #endif

  18. //不被执行,cpp说,sizeof和enum的表达式值作0,那么就是说这里的Y用的是enum里的
  19. #if Y
  20.     printf("#if Yn");
  21. #endif

  22.   return 0;
  23. }
复制代码


大家一起来想想...

论坛徽章:
0
9 [报告]
发表于 2005-11-16 20:37 |只看该作者
我猜测是为了防止冲突所以undefine以前的,不知对不对

论坛徽章:
0
10 [报告]
发表于 2005-11-16 22:29 |只看该作者
宏定义属于编译预处理,即在编译之前进行的符号替换

如果一个宏定义中其定义的内容是宏自身,如 #define X X,即在编译预处理的过程中用 X 来替换 X,那么这样的宏定义其实对于程序代码来说没有任何的实际作用,相当于注释。

对于 enum __socket_type 定义里出现的类似的宏定义来说,可以认为起着这样一种注释说明作用:现在的枚举常量在以前的版本中其实是通过宏定义来实现的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP