2016-11-06 8 views
-3

私はいくつかのソースコードを1行ずつ細かく分割してCを学ぼうとしています。私は(私が思うところでは)式の中のカッコ内の型宣言(?)を見つけました。なぜこれが行われたのだろうかと思います。ここにループのために私を投げている例があります。最初の仮定に式のパレットに型宣言を使用するのはなぜですか?

static void foo(int a) 
{ 
    (void)a; // Why the parantheses and void inside of it? 
} 
struct bar *a = (struct bar *)calloc(1, sizeof(struct bar)); 
//^Why declare struct bar pointer? 

、私はそれが宣言と一致する結果または値を強制的に何かを持っている想像するが、関数の例の場合には、理由だけfoo(void)をしませんか?

また、このパターンの名前がある場合(名前を付けるのが難しいため、何が起こっているのか記述しているため)、後で検索する方が簡単です。

ありがとうございます!

+3

CとC++は**異なる*言語です!あなたは何について尋ねていますか? – Olaf

+0

@Olaf私はC.を意味していました.C++は、私が行った推奨タグでした。私は混乱のためにお詫び申し上げます。 – MSD

+0

いいえ、そうではありませんでした!構文補完はお勧めできません。 – Olaf

答えて

1

と書いています。彼らはCスタイルのキャストです。 C++でそれらを使用しないでください。 C++でのCスタイルのキャストの使用を必要とするケースが1つありますが、私は自分のキャリアの中で必要なものを決して実行していません。

キャストは、1つの型の変数が異なる型を持つことをコンパイラに伝えます。

式をvoidにキャストすると、コンパイラは結果を気にしません。コンパイラにすべてのことを知らせるよう警告するとき、警告を避けることができます。

+0

"キャストは、あるタイプの変数が異なるタイプを持つことをコンパイラに通知します。 - エル、...あるオブジェクトを別のオブジェクトに変換するようにコンパイラに指示します。 Cには再解釈のキャストはありません。型打ちは、UBを呼び出すポインタキャストを介して、共用体を介してのみ行われます( 'char'と' void * 'の例外があります)。 – Olaf

2

声明

(void)a; 

参照a、その後、あなたはaは未使用の変数であることをコンパイラの警告を得ることはありません。

(void)は、必要な構文です。

あなた2番目の質問

struct bar *a; 

structのその型を指し示す変数を定義します。しかし同時に、あなたは

struct bar *a = (struct bar *)calloc(1, sizeof(struct bar)); 

でそれを初期化しているこれは

struct bar *a; 
a = (struct bar *)calloc(1, sizeof(struct bar)); 

と同じになりますが、Cでそれがcallocや他の割り当て関数からの戻り値をキャストしない間違いなく優れています。私はその行を

a = calloc(1, sizeof *a); 
+1

なぜ '(void)'が必要ですか? –

+1

'(void)'は "必須の構文"ではないので、未使用変数の警告に関しては一部のコンパイラが従います。 –

+0

@ M.M実際はMSVCでは必須ではありませんが、 'a;'で十分です。私は他の投稿から、それが不足していることを理解しました。 –

関連する問題