附帶的代碼在使用g ++編譯時會產生問題,如圖所示。 1)爲什麼const char *(和char const *)在const String不工作的情況下工作,其中String是char *類型的char *? 2)在第二個代碼片段中,如何避免警告?我無法更改結構XrmOptionDescRec。它在libx11-dev的X11/Xresource.h中定義。X g遺留代碼:ISO C++禁止將字符串常量轉換爲'char *'
附加信息:
結構體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);
與你的問題無關,但爲什麼你有一個類型別名'String'來處理字符串?爲什麼不是標準的'std :: string'類?代碼中實際上沒有太多的C++,它可以很容易地用C編譯器編譯。 –
該類型別名也來自X遺留代碼/usr/include/X11/Intrinsic.h。手頭的代碼也是遺留代碼:xpdf,用C++編寫。 – user1914074