4

私はGCC4.2でMacOS-XLionに取り組んでいます。このコードは機能しますが、修正したい警告が表示されます。

#include <unistd.h>
main()
{
    char *args[] = {"/bin/ls", "-r", "-t", "-l", (char *) 0 };
    execv("/bin/ls", args);
}

警告:文字列定数から'char*'への非推奨の変換

警告を抑制したくない、まったく警告を出さないようにしたい。これはC++コードであり、Cではありません。

char * const(つまり、execv()に必要なタイプ)を使用しても、警告が生成されます。

ありがとうございました。

4

6 に答える 6

4

これは問題ないようです:

#include <unistd.h>
main()
{
    char const *args[] = {"/bin/ls", "-r", "-t", "-l", NULL };
    execv("/bin/ls", const_cast<char**>(args));
}
于 2012-06-09T14:45:13.437 に答える
1

受け入れられた回答が選択された理由がわかりません。このコードを実行しても警告は削除されません....

特定のプラットフォームでは確認できませんが、各文字列定数にキャストを追加すると、警告がなくなりました。

#include <unistd.h>
main()
{
    char* const args[] = {(char*)"/bin/ls", (char*)"-r", (char*)"-t", (char*)"-l", (char*) 0 };
    execv("/bin/ls", args);
}

また

#include <unistd.h>
main()
{
    char *args[] = {(char*)"/bin/ls", (char*)"-r", (char*)"-t", (char*)"-l", (char*) 0 };
    execv("/bin/ls", args);
}

非常に冗長で煩わしいかもしれませんが、警告は消えます。

これを実行しています: g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4

于 2016-02-15T16:10:52.080 に答える
1

警告が表示される唯一の理由は、gcc ではなく g++ を使用しているためです。純粋な C では、警告はまったく表示されません。ここから警告のない C++ コードを作成するのは、実際には非常に困難です。正直なところ、私は試みましたが成功しませんでした。

これらのハードルは、特定の哲学学校が存在する理由の 1 つです。詳しくはこちらをご覧ください

于 2013-09-05T06:53:10.977 に答える
1

文字列定数を変更可能な文字ポインターに変換し、暗黙のキャストを使用して変更しています。コンパイラーは、言語の新しいバージョンではこのキャストが許可されないことを警告しています。

文字列リテラルを定義する場合、C++ はそれを可変文字配列として定義した定数文字配列を意味すると理解するので、それに応じてコードを変更します。

于 2012-05-28T21:59:34.913 に答える
1

変化する:

char *args[] = {"/bin/ls", "-r", "-t", "-l", (char *) 0 };

に:

char *const args[] = {"/bin/ls", "-r", "-t", "-l", NULL };
于 2012-05-28T23:16:07.927 に答える