添付のコードは、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);
質問には関係ありませんが、なぜ文字列を処理するための型エイリアス 'String'がありますか?標準の 'std :: string'クラスはどうでしょうか?あなたのコードには本当にC++はあまりありませんが、Cコンパイラで簡単にコンパイルできました。 –
そのタイプ・エイリアスは、Xレガシー・コードの/usr/include/X11/Intrinsic.hからのものです。現在のコードは、レガシーコードでもあります.xpdfはC++で書かれています。 – user1914074