C++ 函数签名不';t match调用的函数,常量char[]和char*之间的差异?

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(回调) 回调:指向消息回调函数的指针,该函数在该客户端

我使用的是PubSubClient.h,定义如下:

实例的创建如下所示:

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
部分必须匹配。

这只是一个bug
const char[]
const char*
在该上下文中是相同的,但如果没有
const
则有所不同,并且不兼容。文档错误。github上的代码使用
#define MQTT_CALLBACK_SIGNATURE void(*CALLBACK)(char*,uint8_t*,unsigned int)
您是否检查了文档是否对应于相同版本的二进制文件?可能是版本不同,所以签名也不同。您是否尝试转储二进制文件以查看可用的函数?dumpbin/EXPORTS“…\yourlib.dll”