如何在类向量中存储/使用外部函数指针

Posted

技术标签:

【中文标题】如何在类向量中存储/使用外部函数指针【英文标题】: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 提示。我会在它工作后立即修复它。) 【参考方案1】:

原来是编译器问题:

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

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

感谢添加 cmets 的人。

【讨论】:

以上是关于如何在类向量中存储/使用外部函数指针的主要内容,如果未能解决你的问题,请参考以下文章

在函数中使用向量指针时出错

存储各种 void 函数指针及其参数的向量

如何在类中有函数指针?

C++函数调用运算符 函数对象 函数指针

如何创建一个填充了 C 风格函数指针和 lambda 的向量(有和没有捕获)

在指针向量c ++中存储新对象