【问题标题】:C++ invalid conversion from 'const char*' to 'char*' Arduino Uno从 'const char*' 到 'char*' Arduino Uno 的 C++ 无效转换
【发布时间】: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 向我们展示。而且您永远不应该将const anything 转换为非常量。您可以将const 扔掉,但这几乎总是一个坏主意。顺便说一句,错误消息包含有关您收到警告的原因的提示(您将 const char * 传递给需要 char * 的函数)。
  • 如果您确定publish 不会修改TopicMessage 指向的字符串,您可以使用丑陋的演员表来丢弃constpublish(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++


【解决方案1】:

我对@9​​87654321@ 函数一无所知,但如果它需要一些可修改的字符串(char * 没有const)用于TopicMessage,那么你有提供可修改字符串。

char topic[] = "SampleTopic";
char msg[] = "Hello";

(您必须确保存储空间足以进行修改)

另一方面,如果这个函数确实需要一些可修改的字符串,那么这可能是API中的一个错误,这些参数应该被声明为const char *
如果确实如此,您可以在传递两个const char * 参数时安全地使用const_cast(甚至是传统的C cast)。

const char* topic = "SampleTopic";
const char* msg = "Hello";
publish(0, 0, 0, ???msgid???, const_cast<char *>(topic), const_cast<char *>(msg));

请注意,在您的示例中,您使用的是字符串 "msgid",其中应该是 unsigned int

【讨论】:

  • 根据库代码,这些参数在内部没有被修改,可以声明为 const(如果它应该是 const 正确的话应该是)。
猜你喜欢
  • 1970-01-01
  • 2021-01-30
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多