一个关于C语言结构体内有宏定义的问题,请热心大神点播
看不懂为什么它嵌套了好几层#if,不知道最后编译出的WSAData是个什么样子? 我是题主,代码的五个嵌套#if看得我一头雾水。以上代码来自https://learn.microsoft.com/zh-cn/windows/win32/api/winsock2/ns-winsock2-wsadata【WSADATA (winsock2.h) - Win32 apps】
个人认为是写这段代码的人写错了,他的出发点应该是除了wVersion和wHighVersion的另外五个成员,要么写成iMaxSockets、iMaxUdpDg、lpVendorInfo、szDescription、szSystemStatus的顺序,要么写成szDescription、szSystemStatus、iMaxSockets、iMaxUdpDg、lpVendorInfo的顺序。但他写的这个五个嵌套#if实际上表达出的逻辑完全不符他的出发点。
个人认为代码应该写成:
typedef struct WSAData {
WORD wVersion;
WORD wHighVersion;
#if ...
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
char szDescription;
char szSystemStatus;
#else
char szDescription;
char szSystemStatus;
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
#endif
} WSADATA, FAR * LPWSADATA; 这个是条件编译,不同的定义走不同的代码段。 是的,你的想法没错,实际上的winsock2.h就是这样定义的
typedef struct WSAData {
WORD wVersion;
WORD wHighVersion;
#ifdef _WIN64
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
char szDescription;
char szSystemStatus;
#else
char szDescription;
char szSystemStatus;
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
#endif
} WSADATA, FAR * LPWSADATA; 条件编译指令
不满足条件的语句块不执行编译,不生成机器代码 wqc159 发表于 2022-10-29 20:56
这个是条件编译,不同的定义走不同的代码段。
是的,不过按照五个嵌套#if的逻辑,会走出”是是是是是“”是是是是否“”是是是否“”是是否“”是否“”否“六种结果,但实际上 我猜 写这段代码的人 应该只想输出 两种结果。 跨平台代码都是这样的呀
页:
[1]