我正在使用PubSubClient.h,如此处定义:https://pubsubclient.knolleary.net/api.html
实例创建如下:
WiFiClientSecure secureCl;
PubSubClient mqttCl(secureCl);
PubSubClient具有名为setCallBack的方法,该方法接受参数callback。
PubSubClient setCallback(回调)
callback:指向消息回调函数的指针,当消息到达为此客户端创建的预订时调用。
以下签名是给函数回调的:
void callback(const char[] topic, byte* payload, unsigned int length)
但是,在给出的示例代码中,在安装程序中,使用的回调函数是receiveCallback函数:
mqttCl.setCallback(receivedCallback); //called inside setup()
并且该函数给出为:
void receivedCallback(char* topic, byte* payload, unsigned int length) {
//some code here
}
[现在,我看到它具有char*
主题,而不是const char[]
,并且我无法理解它不是由签名定义的const char []的原因。有人可以简单地解释为什么会这样吗?
似乎是bug,在这种情况下,问题是由const
属性e引起的,而不是由[]
或*
引起的。实际上,const char[]
和const char*
相等,char[]
和char*
也相等,但是const char[]
和char*
可以创建不兼容的东西。
区别在于您的回调缺少const
。基本上,char* topic
作为参数意味着您可以像topic
一样操作topic[0] = 'A';
的内容。另一方面,const char*
或const char[]
保证不会更改基础字符串,因此可以提供指向只读存储器中的字符串的指针。
mqttCl
例如可以执行以下操作:
byte payload[10];
callback("test-topic", payload, 10);
并且您的recievedCallback
被允许这样做:
topic[0] = 'b';
允许编译器将"test-topic"
存储在进程的只读存储器中,在这种情况下,程序将崩溃。为了防止这种情况,类型签名中的const
部分必须匹配。