私はクラスを持っていますprivate char str[256];
そのために、明示的なコンストラクターがあります。
explicit myClass(const char *func)
{
strcpy(str,func);
}
私はそれを次のように呼びます:
myClass obj("example");
これをコンパイルすると、次の警告が表示されます。
文字列定数から「char*」への非推奨の変換
なぜこうなった?
私はクラスを持っていますprivate char str[256];
そのために、明示的なコンストラクターがあります。
explicit myClass(const char *func)
{
strcpy(str,func);
}
私はそれを次のように呼びます:
myClass obj("example");
これをコンパイルすると、次の警告が表示されます。
文字列定数から「char*」への非推奨の変換
なぜこうなった?
これは、次のような状況が発生したときに表示されるエラー メッセージです。
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 が欠落しています。しかし、あなたが私たちに示したコードは、この種の非推奨の変換を行わないため、問題ではありません。警告は別の場所から来たに違いありません。
警告:
文字列定数から「char*」への非推奨の変換
あなたが(投稿したコードではなく)どこかで次のようなことをしているためです:
void foo(char* str);
foo("hello");
const char[]
問題は、文字列リテラル ( type ) をに変換しようとしていることですchar*
。
const char[]
配列はポインターに減衰するため、 aをに変換できconst char*
ますが、変更可能なものを定数にしています。
この変換はおそらく C との互換性のために許可されており、前述の警告が表示されるだけです。
答えとしていいえ。2 by fnieto-Fernando Nietoは、コードのどこかで(投稿したコードではなく)次のようなことをしているため、この警告が表示されることを明確かつ正確に説明しています。
void foo(char* str);
foo("hello");
ただし、コードを警告なしに保ちたい場合は、コードにそれぞれ変更を加えるだけです。
void foo(char* str);
foo((char *)"hello");
つまり、string
定数をにキャストするだけ(char *)
です。
実際、文字列定数リテラルは const char * でも char* でもなく、char[] です。これは非常に奇妙ですが、C++ 仕様に書き留められています。これを変更すると、コンパイラがコード セグメントに格納する可能性があるため、動作は未定義になります。
このマクロをコードの最初のどこかに追加することで、この問題を解決します。または、それを追加します、<iostream>
へへ。
#define C_TEXT( text ) ((char*)std::string( text ).c_str())
以下に解決策を示します。文字列を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';
}