2017-03-01 18 views
0

添付のコードは、g ++でコンパイルすると問題を引き起こします。 1)なぜconst char *(およびchar const *)はconst Stringが動作しないときに動作しますか?Stringはchar *にtypdefされますか? 2)2番目のコードスニペットで、警告を回避する方法は?構造体XrmOptionDescRecを変更することはできません。 libx11-devのX11/Xresource.hで定義されています。g ++のXレガシーコード:ISO C++は文字列定数を 'char *'に変換することを禁じています

追加情報:
構造体XrmOptionDescRecはCヘッダファイルで与えられ、libx11-6 Cライブラリ、特に関数XtAppInitialize()が呼び出されます。その関数を呼び出すC++コードを書く方法は、私のコードスニペットの2番目の部分を参照してください。 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

定数文字の配列です。このため、定数ではない文字(つまりchar*)へのポインタを文字列リテラルを指すポインタにすることはできません。

構造体を変更できない場合(システムヘッダファイルで定義されている場合など)、文字列を(非定数の)配列に格納し、ポインタが(非定数の)配列を指すようにする必要があります。

例は

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

const Stringconst 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

関連する問題