C++ 函数签名不';t match调用的函数,常量char[]和char*之间的差异?
我使用的是PubSubClient.h,定义如下: 实例的创建如下所示:C++ 函数签名不';t match调用的函数,常量char[]和char*之间的差异?,c++,android-wifi,C++,Android Wifi,我使用的是PubSubClient.h,定义如下: 实例的创建如下所示: WiFiClientSecure secureCl; PubSubClient mqttCl(secureCl); byte payload[10]; callback("test-topic", payload, 10); PubSubClient有一个名为setCallBack的方法,它接受参数callback PubSubClient setCallback(回调) 回调:指向消息回调函数的指针,该函数在该客户端
WiFiClientSecure secureCl;
PubSubClient mqttCl(secureCl);
byte payload[10];
callback("test-topic", payload, 10);
PubSubClient有一个名为setCallBack的方法,它接受参数callback
PubSubClient setCallback(回调)
回调:指向消息回调函数的指针,该函数在该客户端创建的订阅的消息到达时调用
为函数回调提供了以下签名:
void callback(const char[] topic, byte* payload, unsigned int length)
但是,在我给出的示例代码中,在设置中使用的回调函数是receivedCallback函数:
mqttCl.setCallback(receivedCallback); //called inside setup()
其功能如下所示:
void receivedCallback(char* topic, byte* payload, unsigned int length) {
//some code here
}
现在,我可以看到它有
char*
主题,而不是const char[]
,我无法理解它不是签名定义的const char[]。有人能简单地解释一下为什么会这样吗?这似乎是一个错误,在这种情况下,问题是由常量
属性e给出的,而不是由[]
或*
给出的。实际上const char[]
和const char*
是相等的,同样char[]
和char*
是相等的,但是const char[]
和char*
可以创建一些不兼容的东西区别在于回调缺少const
。
基本上,char*topic
作为参数意味着允许您操作topic
的内容,如topic[0]=“A”代码>。
另一方面,const char*
或const char[]
保证不会对基础字符串进行更改,因此可以提供指向只读内存中字符串的指针
mqttCl
例如可以执行以下操作:
WiFiClientSecure secureCl;
PubSubClient mqttCl(secureCl);
byte payload[10];
callback("test-topic", payload, 10);
您的ReceivedCallback
可以执行以下操作:
topic[0] = 'b';
允许编译器将“测试主题”
存储在进程的只读内存中,在这种情况下,程序将崩溃。为了防止这种情况发生,类型签名中的const
部分必须匹配。这只是一个bugconst char[]
和const char*
在该上下文中是相同的,但如果没有const
则有所不同,并且不兼容。文档错误。github上的代码使用#define MQTT_CALLBACK_SIGNATURE void(*CALLBACK)(char*,uint8_t*,unsigned int)
您是否检查了文档是否对应于相同版本的二进制文件?可能是版本不同,所以签名也不同。您是否尝试转储二进制文件以查看可用的函数?dumpbin/EXPORTS“…\yourlib.dll”