【问题标题】:What does this macro return and how do use it?这个宏返回什么以及如何使用它?
【发布时间】: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

标签: c struct macros


【解决方案1】:

看起来vhl(这是一个 8 位成员,除非 CHAR_BIT 在您的平台上是一个奇怪的值)用于将版本存储在有效的 4 位中,并将标头长度存储在其他 4 位中。

((ip)->vhl) & 0x0f) 提取structip 所指向的vhl 成员的最低有效4 位。

乘以 4 得到实际长度只是遵守该成员的约定。

您使用sizeof“手动获取长度”的方式是假设标题长度对应于各个成员大小的总和。成员 padding 和以用于您的 struct 的序列化技术为中心的未记录约定可能意味着情况并非如此。

【讨论】:

  • 鉴于结构的名称,这可能是 ipv4。并且,well,“Internet Header Length 是 Internet 标头的 32 位字的长度”,因此可能是 * 4
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 2011-04-14
  • 2011-12-14
相关资源
最近更新 更多