中の#ifとキャスティング:このコードは、エラーを与えるのはなぜC
#include <stdio.h>
#define Rep (int)6
int main(){
#if Rep==6
printf("T");
#else
printf("F");
#endif
return 0;
}
- なぜそれがキャストを拒否していますか?
- 「プリプロセッサエラー」または「コンパイラエラー」ですか?
中の#ifとキャスティング:このコードは、エラーを与えるのはなぜC
#include <stdio.h>
#define Rep (int)6
int main(){
#if Rep==6
printf("T");
#else
printf("F");
#endif
return 0;
}
これはプリプロセッサのエラーです。これは、プリプロセッサが変数をキャストする方法を理解していないために発生します。 #if
でCコードを使用することはできません。単純な数字だけでなく、数字に展開するマクロも使用できます。
あなたがRep
を変更することができない場合、あなたは最初からキャストを削除ヘルパーマクロ、でこれを回避することができますキャストを組み合わせて、それはまだ#if
で動作するはずが容易で
#include <stdio.h>
#define X(x)
#define Y(x) X x
#define Rep (int)6
int main(void) {
#if Y(Rep) == 6
printf("%d\n", Y(Rep)); // prints 6
#endif
return 0;
}
それは邪悪な小さなマクロです。 –
単に '#define Rep((int)+6)'とするだけです。しかし、待って、 '6'は' int'です、なぜ一緒に一緒にキャスト。 –
@ JensGustedt一般的なキャストの構文とは異なるため、これは簡単なことではありません。つまり、ハックを追加するには定数を変更する必要があります。そして定数を変更できれば、効果のないキャストを削除する方が良いでしょうか? –
Preprossorマクロを書き込み:数字の前に少しだけ+
を追加してください。あなたのケース
#define Rep ((int)+6)
では、プリプロセッサは、そのように最終的な結果が同じ値である0
で知らない識別子を置き換えます。
また、Rep
マクロのキャストはそれ自体ではまったく役に立ちません。とにかく6
はint
です。したがって、ほとんどの場合、接尾辞としてU
とL
を組み合わせて、独自のリテラルを持つすべての整数型のキャストを避ける方がよいでしょう。
あなたはエラーを投稿できますか? – nielsbot
おそらく見ているエラーは、プリプロセッサが型名 'int'かキャスト演算子のどちらかを理解できないためです。あなたが見ていない、または無視しているエラーや警告は、(a)必要な '#include'が不足しているため、(b) 'void main()'が 'int main(void) '、そして(c)出力は改行で終わらなければなりません:' printf( "T \ n"); '。コンパイラはこれらの問題をすべて診断する必要はありませんが、修正する必要があります。 –
@nielsbot Eclipse IDEからのエラー:「トークンの前に2進演算子がありません」「6」「 –