【问题标题】:why i the pointer is not a structure or union? [duplicate]为什么我的指针不是结构或联合? [复制]
【发布时间】:2019-03-19 06:18:44
【问题描述】:
#include <stdio.h>

struct m_tag {
    short m_tag_id;
    short m_tag_len;
    int   m_tag_cookie;
};
struct packet_tags {
    struct m_tag *slh_first;
}tags;

#define SFIRST(head) ((head).slh_first)
int main(void) {
    printf("%p\n", SFIRST(&tags));
    return 0;
}

在函数'main'中: 错误:在不是结构或联合的东西中请求成员“slh_first”

这段代码有什么问题?

【问题讨论】:

  • 因为如果你看一个写着“湖这边”的标志,这个标志不是湖吗?
  • 您是否尝试过不使用宏访问slh_first?看起来怎么样?
  • 您的选择是:stuctPointer-&gt;structMemberstructObject.structMember 但不是stuctPointer.structMember
  • 顺便说一句,你写的是 C 还是 C++?毕竟,你一次只能用一个编译器编译这个小程序。请不要为了吸引浏览而添加标签,这是对系统的滥用,并且会受到 C 和 C++ 社区的强烈反对。
  • 此类宏在 C 中可能很有用,但在 C++ 中应避免使用,而是更喜欢内联(模板化)函数。

标签: c++ c


【解决方案1】:

您正在尝试使用operator. 访问slh_first 成员,这需要左侧有packet_tags实例。但是您没有将packet_tags 的实例传递给SFIRST(),而是将指针 传递给packet_tags 实例。因此,为了访问成员,您需要取消引用指针以到达实例。在指针上调用 operator. 是编译器所抱怨的。

SFIRST()改为:

#define SFIRST(head) ((head)->slh_first)

或者,不太受欢迎但同样有效:

#define SFIRST(head) ((*(head)).slh_first)

【讨论】:

    【解决方案2】:

    将您的代码更改为以下代码:

    #include <stdio.h>
    
    struct m_tag {
        short m_tag_id;
        short m_tag_len;
        int   m_tag_cookie;
    };
    struct packet_tags {
        struct m_tag *slh_first;
    }tags;
    
    #define SFIRST(head) ((head)->slh_first)
    int main(void) {
        printf("%p\n", SFIRST(&tags));
        return 0;
    }
    

    【讨论】:

    • “将您的代码更改为此”不是一个有用的 SO 答案。为什么需要更改? OP做错了什么?查看现有答案以查看应如何在此处回答问题的示例。顺便说一句,它已经建议您在此处进行修复。
    • 这也是第 n 个重复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多