2015-10-14 8 views

答えて

11

はい(明らかに私が何かを誤解しました)。

(void)p; 

オブジェクトは(完全な型ではないです)、void型にキャストなっていると完全に表現され、式の結果は使用すべきではないということ、したがって、コンパイラはそれの使用状況をチェックしないことを意味し。 void式(空隙型を持つ式)の(存在しない)値は、任意の方法で使用されないものと C11標準、章6.3.2.2、void

を引用

、... [ ...]他のタイプの式がvoid の式として評価される場合、その値または指定子は破棄されます。

したがって、警告またはエラーは生成されません。

OTOH、

(void *)p; 

は、オブジェクトが完全な型であり、あなたのプログラムで使用されなければならないvoidタイプへのポインタであることを意味します。その場合、式からオブジェクトを使用しないことは、コンパイラによって正しく報告されます。あなたは

(void) p; 

を行うと

+0

アドレスの以前のキャスティング値が 'p'で指し示されていて、これに変更がありますか? – ameyCU

+0

@ameyCU nopes。副作用がある場合にのみ効果がありますが、ここではそうではありません。 –

+0

'' p * 'を' int * 'に再度キャストすることは安全でしょうか? – ameyCU

14

は、あなたは、単に表現pの結果を無視するようにコンパイラに指示します。これは、効果的に空の文と同じです:

; 

あなたはあなたが一般的なポインタとして変数pを治療するためのコンパイラを

(void *) p; 

教えてください、そしてそれはのための完全な表現だとき実際に何もしないで、エラーメッセージが表示されます。

+0

この機能を実際に使用することはできますか? –

+1

@DavidHaim:特定のローカル変数が 'IFDEF'の内部でのみ使用され、' ELSE'ブランチを持つ設定でコンパイルされたときに警告を出さないようにするために見ました。 –

+0

lolなので、ローカル変数をELSEブランチ内に宣言するのは、それが唯一の場所であればそれです。あなたがスコープの先頭にあるすべての変数を一緒に宣言することができます。 –

関連する問題