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.我只是好奇,那些宏的目的是什么?
这些常量过去只是#defines,所以你所看到的可能就是保护你不会意外地混合旧的和新的头文件.使用enum定义常量的一个优点是enum成员往往在调试器中可用,而#define宏则不然.
如果您(意外地)包含一些其他尝试的头文件#define SOCK_STREAM,您将收到编译器警告,而不是静默使用可能不正确的值.
通过一个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)
你有它.