shiiiiiiiiitbro 发表于 2022-10-29 12:08

一个关于C语言结构体内有宏定义的问题,请热心大神点播

看不懂为什么它嵌套了好几层#if,不知道最后编译出的WSAData是个什么样子?

shiiiiiiiiitbro 发表于 2022-10-29 14:17

我是题主,代码的五个嵌套#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;

wqc159 发表于 2022-10-29 20:56

这个是条件编译,不同的定义走不同的代码段。

DEATHTOUCH 发表于 2022-10-29 22:58

是的,你的想法没错,实际上的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;

6767 发表于 2022-10-29 23:07

条件编译指令
不满足条件的语句块不执行编译,不生成机器代码

shiiiiiiiiitbro 发表于 2022-11-8 00:03

wqc159 发表于 2022-10-29 20:56
这个是条件编译,不同的定义走不同的代码段。

是的,不过按照五个嵌套#if的逻辑,会走出”是是是是是“”是是是是否“”是是是否“”是是否“”是否“”否“六种结果,但实际上 我猜 写这段代码的人 应该只想输出 两种结果。

c03xp 发表于 2022-11-14 15:43

跨平台代码都是这样的呀
页: [1]
查看完整版本: 一个关于C语言结构体内有宏定义的问题,请热心大神点播