【发布时间】:2019-12-07 01:52:18
【问题描述】:
我已经浏览了以下链接,但无法使用:
Adding to c* invalid conversion from const char* to char*"
Why is conversion from string constant to 'char*' valid in C but invalid in C++
我正在开发 arduino Uno。我需要将char* 类型的参数发送给函数。我有以下代码:
const char* topic = "SampleTopic";
const char* msg = "Hello";
publish(0, 0, 0, "msgid", topic, msg);
我收到此错误:
初始化'void GSM_MQTT::publish(char, char, char, unsigned int, char*, char*)'的参数5
void publish(char DUP, char Qos, char RETAIN, unsigned int MessageID, char *Topic, char *Message);
警告:从 'const char*' 到 'char*' 的无效转换 [-fpermissive]
publish(0, 0, 0, _generateMessageID(), topic, msg);
^
我什至尝试过使用const std::string& topic = "SampleTopic";,但收到此错误:
命名空间'std'中的'string'没有命名类型
即使const char* topic = (char*)"SampleTopic"; 并将其作为func(topic) 传递也会产生相同的错误。
我该如何解决这个问题??
【问题讨论】:
-
字符串和字符串文字是 C 和 C++ 不同的地方。您必须记住,C 和 C++ 是两种截然不同的语言,具有不同的语义规则和结构。
-
至于您的
std::string错误,Arduino 可能使用 C++,但 IIRC 它不使用标准 C++ 库。相反,它有自己的类库,例如你有一个String类。 -
哦,你得到的第一个错误与第一个代码 sn-p 不匹配,请尝试创建一个minimal reproducible example 向我们展示。而且您永远不应该将
constanything 转换为非常量。您可以将const扔掉,但这几乎总是一个坏主意。顺便说一句,错误消息包含有关您收到警告的原因的提示(您将const char *传递给需要char *的函数)。 -
如果您确定
publish不会修改Topic和Message指向的字符串,您可以使用丑陋的演员表来丢弃const:publish(0, 0, 0, (char *)topic, (char *)msg);。如果publish在你的控制之下,最好将publish改为使用const char *参数。 -
@IanAbbott 使用
(char*)"Topic Name"但它给了我ISO C++ forbids converting a string constant to 'char*'
标签: c++ arduino arduino-uno arduino-c++