私は教えているクラスのC++ベースの割り当てをまとめています。私は、自分のプログラムのさまざまなところで電話してもらいたいと思っている学生に輸出している機能を持っています。グレーディング中に、それらのコールを傍受して、正しい時間に正しいことをしていることを確認できます。私はそのコードが提供されているスターターファイルで何もすることを望んでいないので、使用していない引き数についてのコンパイラーの警告を抑制するために、すべての引き数をvoid
にキャストする一連のステートメントを含む本体を関数に与えた。その過程で、これまでに見たことのない珍しいコンパイルエラーが発生しました。このサイトを検索しても何の助けにもなりませんでした。あなたが見ることができるように、これらのほとんどはうまくコンパイルvoidへの異常なコンパイラのエラーキャスト?
void iDontUseMyArguments(int a, int b) {
(void) a; // Explicit cast to void - totally fine!
(void) b;
}
void iDontEither(int a, int b) {
(void) a, b; // Comma expression casted to void, though technically
// b isn't casted to void!
}
void norDoI(int a, int b) {
void(a, b); // ERROR! No idea why this isn't okay.
}
void meNeither(int a, int b) {
(void)(a, b); // Comma expression casted to void - totally fine!
}
void jumpOnBandwagon(int a, int b) {
void((a, b)); // Comma expression casted to void - totally fine!
}
:
エラーが最善this reduced test caseを例示することができます。問題はこの1つにあった:
void(a, b);
これは、次のエラーをトリガ:
prog.cpp: In function 'void norDoI(int, int)':
prog.cpp:11:11: error: expression list treated as compound expression in functional cast [-fpermissive]
void(a, b);
^
私は、このエラーメッセージが発生したことがありませんので、私はこれが私に教えしようとしているかわからないんだけど。
ラインの背後にある意図
void(a, b);
は、関数スタイルのキャストを使用してvoid
型にキャストしa
とb
を含むコンマ式であることでした。あなたが見ることができるように、次のようにすべての作業をバリアント:
(void)(a, b);
void((a, b));
私は、これはおそらくほとんどの難問の解析とは何かを持っており、これは宣言と解釈ばかり、私は取得しています特定のエラーがない疑いますこれにマッチするようです。
私の質問は以下の通りです:
- なぜ、正確に、このコードは、法的ではないでしょうか?
- コンパイラは私が何をしようとしていると思いますか?
- なぜ、これらの他のバリアントは合法的なのですか?
教えを始める前にもっと多くのことを学ぶ必要があります。 – SergeyA
@SergeyAどういう意味でしょう。誰が彼らはC++を教えると言います。 – NathanOliver
@ NathanOliver、私はOPがC++を教えると確信しています。私が間違っているなら、私は恩赦を請う。私が正しいとすれば、これは私たちが学校で行っているプログラミング教育に関するすべての問題を意味します。 – SergeyA