附带的代码在使用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);
答案 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";