3

私はしばらくの間、Windows で MinGW を使用したプロジェクトに取り組んできましたが、現在は Mac で (GCC を使用して) コンパイルしようとしています。私は Qt を使用していますが、それは問題とはあまり関係がありません。

なぜ GCC はとても形式的で、私にすべてをキャストさせているのですか? 一致しないものすべてを通過してキャストする必要があるのはばかげています。

たとえば、次のエラーがスローされます。

main.cpp: error: invalid conversion from 'const char*' to 'char*'

このコードで:

const char *a = "a";
char *b = a;

これらを無視するように GCC コンパイラまたはプリプロセッサ ディレクティブに渡すことができるフラグはありますか? ありがとう。

編集:言い換えさせてください。それが MinGW では機能するのに GCC では機能しないのはなぜですか? GCC で機能させることはできますか?

編集 2: MinGW - http://i.imgur.com/zGvf6.png

4

3 に答える 3

5

gcc が衒学的であるというわけではありません。const char*は へのポインタであり、を指すconst charとは大きく異なる型です。後者の場合はポインターの内容を変更できますが、前者の場合は変更できません。この変換を暗黙的に許可すると、重大なバグが発生する可能性があります。これは、内容が変更できないと想定されている場合でも、非 const ポインターを使用して内容を変更するのは簡単なことだからです。char*chara

理論的には、定数をキャストできます。

char* b = const_cast<char*>(a);

これは、あなたがやっていることは安全ではないことを知っていることをコンパイラーに伝えますが、その位置では constness を無視しても問題ないことを明示的にconst char*伝えたので、何かひどいことが起こった場合 ( a のデータを変更しようとした場合)は完全に責任を負うことになります。 . そのようなことは、問題がないことを確認した後にのみ、まばらに行う必要があります。

gcc と mingw を調べると、コンパイル時に暗黙のキャストが実際に受け入れられます-fpermissive(警告に格下げされます)。しかし、そのような危険な機能を使用することは非常に悪い考えです。そのため、このような邪悪な誘惑からできるだけ離れることをお勧めします。エラーのしきい値を下げる代わりに、コンパイラを可能な限りうるさくするために-Wall-Wextra、おそらく and など-pedanticのオプションを提案したいと思います。-Werrorそうすることは、プログラミングでは苦痛かもしれませんが、何時間ものデバッグを簡単に省くことができます (警告ポリシーなしで、または-Werrorもちろん)。

char*質問とは直接関係ありませんが、c++ を使用しているため、使用できるときになぜ必要なのstd::stringですか?

于 2012-10-08T16:24:38.550 に答える
0

a は cont char* であるため、a が指す値は変更されるべきではないため、この変換を無視するオプションはありません。したがって、b は a が指す値を変更できるため、const char* から char* へのキャストは安全ではないと見なされます。

于 2012-10-08T16:27:21.517 に答える
0

これはどのコンパイラでも機能しません。ただし、一部の古いバージョンのコンパイラ、C 標準、およびその他の違いにより、エラーが発生しない (または単に警告になる) 場合があります。これを許可するように GCC を構成できると思いますが、そのデータへのそれ以上の書き込みアクセスは未定義の動作になるため、その方法については調べません。代わりに、コードを修正する必要があります。これを使用する必要があるシナリオは何ですか?

于 2016-02-10T12:59:16.710 に答える