【发布时间】:2017-12-14 09:24:48
【问题描述】:
我很难理解如何使用此宏来获取 IP 标头的长度。我有一个名为 framehdr.h 的文件,我已将该文件包含在我的 main.c 中。 framehdr.h 文件中的结构如下所示:
struct ip_hdr {
unsigned char vhl; /* Version and header length */
unsigned char tos; /* Type of service */
unsigned short len; /* Total length */
unsigned short id; /* Identification */
unsigned short off; /* Fragment offset field */
unsigned char ttl; /* Time to live */
unsigned char p; /* Protocol */
unsigned short ip_sum; /* Checksum */
unsigned int src, dst; /* Source and dest address */
};
我可以通过像这样添加所有尺寸来手动获取 lentgh:
unsigned int sizeIP = sizeof(testOne.vhl) + sizeof(testOne.tos) +
sizeof(testOne.len) + sizeof(testOne.id) +
sizeof(testOne.off) + sizeof(testOne.ttl) +
sizeof(testOne.p) + sizeof(testOne.ip_sum) +
sizeof(testOne.src) + sizeof(testOne.dst);
但我想使用看起来像这样的宏来获取大小:
#define IP_HL(ip) ((((ip)->vhl) & 0x0f) * 4)
这个宏返回什么?它是一个数字,所以我可以将它存储在一个 int 中然后打印它或者它是如何工作的?
【问题讨论】:
-
自从当一个宏
returns 什么时候? -
@SouravGhosh 好的,它不返回任何东西吗?那我该怎么用呢?你能不能给我一些关于这个主题我能读到的材料的提示?
-
宏调用被预处理器替换。如果你有例如
IP_HL(x)然后将替换为((((x)->vhl) & 0x0f) * 4)。 -
宏不返回任何内容,但在这种情况下,它的计算结果为
int。