2017-03-01 29 views
0

附帶的代碼在使用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); 
+0

與你的問題無關,但爲什麼你有一個類型別名'String'來處理字符串?爲什麼不是標準的'std :: string'類?代碼中實際上沒有太多的C++,它可以很容易地用C編譯器編譯。 –

+0

該類型別名也來自X遺留代碼/usr/include/X11/Intrinsic.h。手頭的代碼也是遺留代碼:xpdf,用C++編寫。 – user1914074

回答

0

在C++字符串文字的恆定字符陣列。正因爲如此,你不能有一個指向非常量字符的指針(即char*)指向一個字符串文字。

如果你不能改變結構(就像它們是在系統頭文件中定義的那樣),那麼你必須將你的字符串存儲在(非常量)數組中,並使指針指向你的(非常量)數組。

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

請注意,const String不等於const char*,它是char* const代替。

因此,代碼:

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

相同

char* const someString = "xxx"; 

很明顯,它產生的警告,因爲它告訴的someString內容可以修改編譯器,而它的真的是一個字符串文字,可以修改NOT

+0

'const char *'和'char const *'是相同的,'char * const'是不同的。 – Mine

+0

「String const」與「char * const」相同嗎? – user1914074

+0

@ user1914074是的,'const String'和'String const'在這裏是相同的。你需要'typedef const char * ConstString;' – Mine