旧包中的 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++ 静态字符串的主要内容,如果未能解决你的问题,请参考以下文章
JNI/NDK开发指南——C/C++访问Java实例方法和静态方法