特殊使用C宏

amc*_*amc 6 c enums preprocessor constants

阅读C库的套接字接口的代码,我发现了这个:

/* Types of sockets.  */
enum __socket_type
{
   SOCK_STREAM = 1,     /* Sequenced, reliable, connection-based
               byte streams.  */
#define SOCK_STREAM SOCK_STREAM
   SOCK_DGRAM = 2,      /* Connectionless, unreliable datagrams
               of fixed maximum length.  */
#define SOCK_DGRAM SOCK_DGRAM
...
Run Code Online (Sandbox Code Playgroud)

这个"成语"遍及bits/socket.h.我只是好奇,那些宏的目的是什么?

rob*_*off 6

这些常量过去只是#defines,所以你所看到的可能就是保护你不会意外地混合旧的和新的头文件.使用enum定义常量的一个优点是enum成员往往在调试器中可用,而#define宏则不然.

如果您(意外地)包含一些其他尝试的头文件#define SOCK_STREAM,您将收到编译器警告,而不是静默使用可能不正确的值.

UPDATE

通过一个glibc git repo,我找到了添加#defines 的特定提交,并带有以下注释:

* sysdeps/generic/socketbits.h: Also make SOCK_* constants available
as macros so that #ifdef works.
* sysdeps/unix/sysv/linux/socketbits.h: Likewise.
Run Code Online (Sandbox Code Playgroud)

你有它.