旧包中的 C/C++ 静态字符串

Posted

技术标签:

【中文标题】旧包中的 C/C++ 静态字符串【英文标题】:C/C++ static string in old package 【发布时间】:2013-12-13 22:25:36 【问题描述】:

我有一个旧的 C/C++ 包,我正在尝试用 CygWin 编译它,因为它需要 Motif 和其他 X- 东西。大部分都可以编译,但是由于诸如...之类的行会出现一些警告。

静态字符串 fallbackResources[] = "Joe", ..etc.. , NULL;

我收到编译器警告:不推荐将字符串常量转换为“String aka char*”

我在谷歌上搜索并找到了许多建议,通过将“char* fred[]”更改为“const char* fred[]”的出现来避免此警告,这是我为包中的大多数 c++ 文件所做的,而这个完美地消除了编译器警告。

但是我被“静态字符串”行卡住了,因为当我通过在“字符串”之前插入“const”来更改它们时,它没有任何区别,如果我将“字符串”更改为“const char *”,警告就会消失,但是由于稍后将数组发送到另一个函数的位置出错,程序无法编译......

无法将参数“7”的“const char*”转换为“char**”到....

任何帮助将不胜感激。

【问题讨论】:

当您将声明更改为“const char*”时,您没有删除“[]”?你需要这些。 String 类型,是 std::string 吗?如果不是,它起源于哪里?你确定事情就是在初始化的时候发疯的吗? 你能贴出其他函数的标题吗?听起来这个静态数组不应该是一个常量字符串数组,而是一个包含常规 char* 的数组。 编辑花了很长时间:你不能让它保持原样并在编译时出现警告吗?这听起来像是一个必要的邪恶。如果您无法处理警告,则将更改保留为“static const char* fallbackResources[]”,并在传递给其他函数时,将静态数组复制到实际的 char** 数组中。 谢谢大家。我确实留下了 [] ,但在文件中看不到任何 String 的定义。我的目标是摆脱错误。好的,我可以抑制警告,但我想先删除它们。这是出错的地方......mainscreen.c++:在函数'int main(int,char**)'中:mainscreen.c++:69:53:错误:从'const char**'到'char*的无效转换*' [-fpermissive] NULL, 0, &argc, argv,fallbackResources, NULL); ^ 在 /usr/include/Xm/Xm.h:59:0,... 中包含的文件中... 【参考方案1】:

谢谢大家,谷歌搜索更多并找到(https://***.com/a/14648630/3100869) - 答案似乎是像这样使用 const_cast:

static String fallbackResources[] = const_cast("Joe"), ..etc.. , NULL;

...警告消失了!

【讨论】:

【参考方案2】:

问题是指针上有两个级别的const:指针本身和它指向的内容。 char const * 是指向 const char 的指针(从右到左读取),而 char* const 是指向 char 的 const 指针。

在您的情况下,String 似乎是char* 的类型定义。像你一样制作这个常量会将它变成char* const。你需要修复 typedef。

【讨论】:

以上是关于旧包中的 C/C++ 静态字符串的主要内容,如果未能解决你的问题,请参考以下文章

Java中有几种类型的流

JNI/NDK开发指南——C/C++访问Java实例方法和静态方法

JNI/NDK开发指南——C/C++访问Java实例方法和静态方法

字符串优化

必须知道的String知识点

C/C++10天气APP:MySQL,PostgreSQL,环境变量,动静态库,Linux/Oracle字符集