169

私はクラスを持っていますprivate char str[256];

そのために、明示的なコンストラクターがあります。

explicit myClass(const char *func)
{
    strcpy(str,func);
}

私はそれを次のように呼びます:

myClass obj("example");

これをコンパイルすると、次の警告が表示されます。

文字列定数から「char*」への非推奨の変換

なぜこうなった?

4

11 に答える 11

164

これは、次のような状況が発生したときに表示されるエラー メッセージです。

char* pointer_to_nonconst = "string literal";

なんで?C と C++ では、文字列リテラルの型が異なります。C では型は char の配列であり、C++ ではchar の定数配列です。いずれにせよ、文字列リテラルの文字を変更することは許可されていないため、C++ の const は実際には制限ではなく、型の安全性に関するものです。const char*からへの変換char*は、安全上の理由から、明示的なキャストなしでは通常不可能です。ただし、C との下位互換性のために、C++ 言語では文字列リテラルを a に代入することが引き続き許可されてchar*おり、この変換が推奨されないという警告が表示されます。

constそのため、 const の正確さのために、プログラム内のどこかで 1 つ以上の s が欠落しています。しかし、あなたが私たちに示したコードは、この種の非推奨の変換を行わないため、問題ではありません。警告は別の場所から来たに違いありません。

于 2009-10-06T09:23:07.397 に答える
150

警告:

文字列定数から「char*」への非推奨の変換

あなたが(投稿したコードではなく)どこかで次のようなことをしているためです:

void foo(char* str);
foo("hello");

const char[]問題は、文字列リテラル ( type ) をに変換しようとしていることですchar*

const char[]配列はポインターに減衰するため、 aをに変換できconst char*ますが、変更可能なものを定数にしています。

この変換はおそらく C との互換性のために許可されており、前述の警告が表示されるだけです。

于 2009-10-07T13:32:35.130 に答える
106

答えとしていいえ2 by fnieto-Fernando Nietoは、コードのどこかで(投稿したコードではなく)次のようなことをしているため、この警告が表示されることを明確かつ正確に説明しています。

void foo(char* str);
foo("hello");

ただし、コードを警告なしに保ちたい場合は、コードにそれぞれ変更を加えるだけです。

void foo(char* str);
foo((char *)"hello");

つまり、string定数をにキャストするだけ(char *)です。

于 2010-12-21T17:18:53.153 に答える
4

実際、文字列定数リテラルは const char * でも char* でもなく、char[] です。これは非常に奇妙ですが、C++ 仕様に書き留められています。これを変更すると、コンパイラがコード セグメントに格納する可能性があるため、動作は未定義になります。

于 2009-10-06T08:59:35.570 に答える
1

このマクロをコードの最初のどこかに追加することで、この問題を解決します。または、それを追加します、<iostream>へへ。

 #define C_TEXT( text ) ((char*)std::string( text ).c_str())
于 2011-09-15T06:59:23.870 に答える
-1

以下に解決策を示します。文字列をcharの定数配列への変数ポインタに割り当てます(文字列はcharの定数配列への定数ポインタと長さ情報です)。

#include <iostream>

void Swap(const char * & left, const char * & right) {
    const char *const temp = left;
    left = right;
    right = temp;
}

int main() {
    const char * x = "Hello"; // These works because you are making a variable
    const char * y = "World"; // pointer to a constant string
    std::cout << "x = " << x << ", y = " << y << '\n';
    Swap(x, y);
    std::cout << "x = " << x << ", y = " << y << '\n';
}
于 2011-09-16T00:39:30.307 に答える