如何在类向量中存储/使用外部函数指针
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_t
和 MqttClient
是否定义在同一个文件中?
感谢您花时间运行测试...我的代码完全如上所示编译。
我正在使用 ARM GCC CPP 编译器为 IOT 设备创建固件,因此我的代码有空的 setup() 和 loop() 函数,而不是 main()。这是与您的代码的唯一真正区别。
吹毛求疵:您的 mqttCallback_t
是函数类型,而不是函数指针类型。它周围的括号什么也不做。并且 POSIX 保留 _t
名称。
你是对的......我将 typedef 更改为 *mqttCallback_t,但我看到相同的编译错误。 (感谢 POSIX 提示。我会在它工作后立即修复它。)
【参考方案1】:
原来是编译器问题:
预处理器正在向前声明类。换句话说,编译器试图在 typedef 之前编译类。
将 typedef 移动到 .h 文件解决了这个问题。
感谢添加 cmets 的人。
【讨论】:
以上是关于如何在类向量中存储/使用外部函数指针的主要内容,如果未能解决你的问题,请参考以下文章