带有g ++的X遗留代码:ISO C ++禁止将字符串常量转换为'char *'

时间:2017-03-01 13:41:43

标签: c++11

附带的代码在使用g ++编译时会产生问题。 1)为什么const char *(和char const *)工作而const String不工作,其中String是char *的典型代码? 2)在第二个代码片段中,如何避免警告?我无法更改结构XrmOptionDescRec。它在libx11-dev。

的X11 / Xresource.h中定义

其他信息:
struct XrmOptionDescRec由C头文件给出,并且调用libx11-6 C库,特别是函数XtAppInitialize()。如何编写调用该函数的C ++代码,请参阅我的代码片段的第二部分。

#include <unistd.h>
#include <stdio.h>

//From: libxt-dev: /usr/include/X11/Intrinsic.h
typedef char* String;
typedef char *XPointer;

typedef enum {
  XrmoptionSepArg
} XrmOptionKind;

// From: libx11-dev: /usr/include/X11/Xresource.h
typedef struct {
  char *option;
  char *specifier;
  XrmOptionKind argKind;
  XPointer value;
} XrmOptionDescRec;

typedef struct {
  const char *option;
  const char *specifier;
  XrmOptionKind argKind;
  XPointer value;
} const_XrmOptionDescRec;

int main(void)
{
/*
Causes compiler warnings:
ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
static const String fallbackResources[] = {
*/

/* Works fine */
  static const char* fallbackResources[] = {
  "*.zoomComboBox*fontList: -*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1",
  "*XmTextField.fontList: -*-courier-medium-r-normal--12-*-*-*-*-*-iso8859-1",
  NULL
};
  printf ("fallbackResources[1]=%s\n",fallbackResources[1]); 

/*
Causes compiler warnings:
ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
static XrmOptionDescRec xOpts[] = {
*/
/* Works fine */
  static const_XrmOptionDescRec xOpts[] = {
  {"-display",       ".display",         XrmoptionSepArg,  NULL},
  {"-foreground",    "*Foreground",      XrmoptionSepArg,  NULL}
};
   printf ("xOpts[1]=%s, %s, %d, %p\n", xOpts[1].option, xOpts[1].specifier, xOpts[1].argKind, xOpts[1].value);

3 个答案:

答案 0 :(得分:1)

请注意,const String不等于const char*,而是char* const

所以代码:

typedef char* String;
const String someString = "xxx";

相同
char* const someString = "xxx";

显然它会生成警告,因为它告诉编译器someString 的内容可以被修改,而它实际上是一个字符串文字并且可以 NOT 进行修改。

答案 1 :(得分:0)

在C ++中,字符串文字是常量字符的数组。因此,您无法指向指向字符串文字的非常量字符(即char*)。

如果你不能改变结构(比如它们是在系统头文件中定义的那样)那么你必须将你的字符串存储在(非常量)数组中,并使指针指向你的(非常数)阵列。

实施例

char modifiableString[] = "Some string here";
char* nonConstPointerToString = modifiableString;

答案 2 :(得分:0)

只需添加 const

const char* str= "some string";