吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 837|回复: 7
收起左侧

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

[复制链接]
shiiiiiiiiitbro 发表于 2022-10-29 12:08
看不懂为什么它嵌套了好几层#if,不知道最后编译出的WSAData是个什么样子?
Annotation 2022-10-29 094923.jpg

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 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[WSADESCRIPTION_LEN+1];

char szSystemStatus[WSASYS_STATUS_LEN+1];

#else

char szDescription[WSADESCRIPTION_LEN+1];

char szSystemStatus[WSASYS_STATUS_LEN+1];

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就是这样定义的
[C] 纯文本查看 复制代码
typedef struct WSAData {
        WORD                    wVersion;
        WORD                    wHighVersion;
#ifdef _WIN64
        unsigned short          iMaxSockets;
        unsigned short          iMaxUdpDg;
        char FAR *              lpVendorInfo;
        char                    szDescription[WSADESCRIPTION_LEN+1];
        char                    szSystemStatus[WSASYS_STATUS_LEN+1];
#else
        char                    szDescription[WSADESCRIPTION_LEN+1];
        char                    szSystemStatus[WSASYS_STATUS_LEN+1];
        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
跨平台代码都是这样的呀
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 05:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表