「みんな教えて! 選手権!!」開催のお知らせ

char *p;
const char *q;
const char a='z';
const char * const pq=&a;

p=q;
p=pq;

コンパイルは出来るのですが、警告が出ます。何故警告が出るのでしょうか?

A 回答 (4件)

> まず、その状態は「コンパイルは出来る」とは言えません。


> 警告(warning)ではなくエラー(error)が出るはずです。

C++ ならそうですね。下の代入二つでconst_castが必要です。
例えばVC7.1なら「error C2440: '=' : 'const char *' から 'char *' に変換できません。」等と言われます。

でも、Cなら通るので、おそらく質問者さんはC言語なのだと思います。
同VC7.1では「warning C4090: '=' : 異なる 'const' 修飾子です。」といわれます。

>質問者さん

Cの時代は const の扱いも結構ゆるい規則でしたが、例えばC++などはこれを厳密に解釈します。
const を正しく扱っていないようなCのコードに慣れてしまうと、将来的に移行などで苦労するかもしれません。
また、きれいに書かれたCのソースはかなりの部分までC++でもそのまま使えますが、この手の警告が多数出るようなCのコードは「移植」しないとまず動かなくなってしまいます。
当面C++に移行する予定がなかったとしても、スキルアップや保守性なども考えて、最初からきちんと書いておくことをお勧めします。
    • good
    • 0

まず、その状態は「コンパイルは出来る」とは言えません。


警告(warning)ではなくエラー(error)が出るはずです。

char *p; // OK: 読み書き両用ポインタを宣言
const char *q; // WARNING: 読み取り専用ポインタを宣言しているが、初期値が入っていないので使い道がない。
const char a='z'; // OK: 読み取り専用変数に文字定数を入れる
const char *pq=&a; // OK: 読み取り専用ポインタに読み取り専用変数のアドレスを渡している。

p=q; // ERROR: 読み書き両用ポインタに読み取り専用のポインタを渡している
p=pq; // ERROR: p = q; に同じ。

読み取り専用メモリを書き込めるようにしたら、意味がありませんよね?
そういう理由です。

なお、この場合は ERROR よりも WARNING の方が問題です。
q は確実に初期化されている必要があるので、普通はこういうコード自体を思いつきません。
短いテストであっても、なるべく結果ありきのコードを書く癖をつけると理解しやすくなりますよ。
    • good
    • 0

がると申します。


んっと…このステップ数にしては、結構な量の警告が予想されるのですが。
とりあえず
・ポインタと実態の違い、あるいは実態を作るタイミング
・const修飾子の意味
をしっかりと学ばれることを強くお勧めいたします。

ちなみに、コンパイルオプションでワーニング出力を抑止する、といった類の場当たり的対応はバグの温床を生むだけなので、お勧めいたしません。
蛇足かとは思いますが、念のため。
    • good
    • 1

const から そうでない変数に代入しているからです。

 動作は問題ありませので気になる場合は、キャストしてあげれば警告は出なくなります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報