2017-11-12 58 views
2

私が取り組んでいるC SDLプロジェクトでは、わかりやすさのために ed char *からstrになりました。今GCCはなぜこの `-Wdiscarded-qualifiers`警告を出すのですか?

私は:

warning: return discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] 

私はchar *にタイプを変更したときに警告がremoveedです:

const char *title = SDL_GetWindowTitle(win); 
SDL_GetWindowTitleconst char *を返し、私が手

const str title = SDL_GetWindowTitle(win); 

typedefは型への単なるエイリアスです。したがって、変数をstrまたはchar *と同じにする必要があります。その警告はどうして得られますか?それとも、私が逃した何かが...?

CLIでGCCを使用しているため、an IDE's faultではありません。

Thxで事前に!あなたのケースで

const str 
const char * 

が異なるタイプですので

+0

"* CLIの* *"? – alk

+2

もうひとつ、ポインタ型をtypedefしたくない素晴らしい例です。 – alk

+1

_ "可読性のために" _ - 難しいですが、これはなぜかの大きなデモンストレーションです。より読みやすいとは言えますが、慣用コードの作成に慣れている経験豊富なユーザーはそうではありませんので、コードが奇妙で愚かに見えることに私は賭けています。 –

答えて

5

typedef sが、マクロ置換ではありません。これはchar *タイプのconst値で

char *const 

ので、可変ストリングを指す:前者は、実際と同等です。あなたの例では、titleを変更することはできませんが、*titleをそのポインタで変更することができます(実際にはconstのメモリを指している場合は、SDL_GetWindowTitleに依存します)。

この問題を解決するには、const char *に別のtypedefを追加する必要があります。

+0

ええ、最初は 'const char *'のために 'cstr'を型定義しましたが、それは不必要な簡潔さだと感じました...私はそれを元に戻すか、単に' str'を取り除くでしょう。 – joH1

関連する問題