函数签名与所调用的函数不匹配,const char []和char *?之间的区别

问题描述 投票:0回答:2

我正在使用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 []的原因。有人可以简单地解释为什么会这样吗?

c++ android-wifi
2个回答
0
投票

似乎是bug,在这种情况下,问题是由const属性e引起的,而不是由[]*引起的。实际上,const char[]const char*相等,char[]char*也相等,但是const char[]char*可以创建不兼容的东西。


0
投票

区别在于您的回调缺少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部分必须匹配。

© www.soinside.com 2019 - 2024. All rights reserved.