【问题标题】:How to store/use external function pointers within a class vector如何在类向量中存储/使用外部函数指针
【发布时间】:2019-04-27 01:43:14
【问题描述】:

我在一个类中使用vector 来存储MQTT 主题指向处理每个主题的MQTT 消息的外部函数的指针。我使用typedef 在类外部定义mqtt 回调函数指针,并在定义vector 对象的结构中使用该typedef。

但是,当我尝试使用typedef 在将向向量添加对象的成员函数中定义函数指针时,我收到了一个编译错误_'mqttCallback_t' has not been declared_。

void addSubscription(char* topic, mqttCallback_t* cback) {

我希望有人能解释为什么编译器会生成此消息,以及需要做什么才能使以下代码正常工作。

// define pointer to an MQTT callback function that is external to the class
typedef void (*mqttCallback_t)(char*, byte*, unsigned int); 

class MqttClient{
    struct MqttSubscription {
        char topic[64];
        mqttCallback_t* callback;
    };
  private:
    byte brokerIP[4];
    uint16_t maxPacketLength;   
    bool sessionActive;
    std::vector<MqttSubscription> subList;
  public:
    void addSubscription(char* topic, mqttCallback_t* cback) {
        MqttSubscription sub;
        strncpy(sub.topic, topic, sizeof(sub.topic));
        sub.callback = cback;
        this->subList.push_back(sub);
    }
);

【问题讨论】:

  • Can't reproduce 使用您显示的确切代码。 mqttCallback_tMqttClient 是否定义在同一个文件中?
  • 感谢您花时间运行测试...我的代码完全如上所示编译。
  • 我正在使用 ARM GCC CPP 编译器为 IOT 设备创建固件,因此我的代码有空的 setup() 和 loop() 函数,而不是 main()。这是与您的代码的唯一真正区别。
  • 吹毛求疵:您的 mqttCallback_t 是函数类型,而不是函数指针类型。它周围的括号什么也不做。并且 POSIX 保留 _t 名称。
  • 你是对的......我将 typedef 更改为 *mqttCallback_t,但我看到相同的编译错误。 (感谢 POSIX 提示。我会在它工作后立即修复它。)

标签: c++ vector function-pointers


【解决方案1】:

原来是编译器问题:

预处理器正在向前声明类。换句话说,编译器试图在 typedef 之前编译类。

将 typedef 移动到 .h 文件解决了这个问题。

感谢添加 cmets 的人。

【讨论】:

    猜你喜欢
    • 2021-06-03
    • 2011-04-15
    • 2020-08-21
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    相关资源
    最近更新 更多