1. ホーム
  2. c++

[解決済み] 警告: 文字列リテラルから 'char *' への変換は非推奨です。

2022-02-17 02:39:31

質問

以下の(C++)コードについて。

char * type = "";
switch (mix_mode) {
        case GO_HISTORY_VIDEO_MIX_VISUAL_GAS:
                type = "visual gas";
                break;
        case GO_HISTORY_VIDEO_MIX_VISUAL:
                type = "visual";
                break;
        case GO_HISTORY_VIDEO_MIX_GAS:
                type = "gas";
                break;
        case GO_HISTORY_VIDEO_MIX_LARGE_IR_DIRECT:
                type = "ir direct";
                break;
        case GO_HISTORY_VIDEO_MIX_LARGE_IR_FILTERED:
                type = "ir filtered";
                break;
}
strcpy(suffix, "avi");


snprintf(filename, sizeof(filename), "%s - (%s %s).%s", name_comp, type, uid, suffix);

以下のようなコンパイル時の警告が出るのですが。

GO_C_MSDExportManager.cpp:192:31: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
                char * type = "";
                              ^
GO_C_MSDExportManager.cpp:195:12: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
                                type = "visual gas";
                                       ^
GO_C_MSDExportManager.cpp:198:12: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
                                type = "visual";
                                       ^
GO_C_MSDExportManager.cpp:201:12: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
                                type = "gas";
                                       ^
GO_C_MSDExportManager.cpp:204:12: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
                                type = "ir direct";
                                       ^
GO_C_MSDExportManager.cpp:207:12: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
                                type = "ir filtered";

char ポインタが安全でないのはわかりますが、この文脈で何か悪いことが起こる可能性はないのでしょうか、一方で type は、他の場所では使われていません。

のようなことができることを知りました。 *type = 'X'; 文字列リテラルを変更し、私のマシンをクラッシュさせる可能性があるため、それは悪いことです。

質問です。

charポインタの何が問題なのでしょうか?

const char * type = new char[20]; は、警告をなくすための良い修正方法でしょうか?

解決方法は?

文字列リテラル の型は const char[] , と注意してください。

C言語では、文字列リテラルはchar[]型であり、(非const)char*に直接代入することができます。C++03でも同様に可能でした(ただし、C++ではリテラルがconstであるため、非推奨)。C++11では、このような代入をキャストなしで行うことはできなくなりました。

では

1.charポインタの何が問題なのでしょうか?

おっしゃるとおりです。 char * は、文字列リテラルを変更することが可能であり、UBにつながります。

文字列リテラルから初期化された配列を作成し、後からその配列を変更するというような方法です。

char type[] = "something"; // type will contain a copy of the string literal

2.Is const char * type = new char[20]; a good fix to get rid of warnings?

ポインタの値を変更するだけで、ポインタの指す内容を変更するわけではないので、ここで新しい配列を作成する必要はありません。の型を変更するだけです。 typeconst char* ,

const char * type = "";