2016-04-22 11 views
2

中の#ifとキャスティング:このコードは、エラーを与えるのはなぜC

#include <stdio.h> 
#define Rep (int)6 
int main(){ 
    #if Rep==6 
     printf("T"); 
    #else 
     printf("F"); 

    #endif 

return 0; 
} 
  1. なぜそれがキャストを拒否していますか?
  2. 「プリプロセッサエラー」または「コンパイラエラー」ですか?
+0

あなたはエラーを投稿できますか? – nielsbot

+0

おそらく見ているエラーは、プリプロセッサが型名 'int'かキャスト演算子のどちらかを理解できないためです。あなたが見ていない、または無視しているエラーや警告は、(a)必要な '#include 'が不足しているため、(b) 'void main()'が 'int main(void) '、そして(c)出力は改行で終わらなければなりません:' printf( "T \ n"); '。コンパイラはこれらの問題をすべて診断する必要はありませんが、修正する必要があります。 –

+0

@nielsbot Eclipse IDEからのエラー:「トークンの前に2進演算子がありません」「6」「 –

答えて

5

これはプリプロセッサのエラーです。これは、プリプロセッサが変数をキャストする方法を理解していないために発生します。 #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; 
} 
+5

それは邪悪な小さなマクロです。 –

+0

単に '#define Rep((int)+6)'とするだけです。しかし、待って、 '6'は' int'です、なぜ一緒に一緒にキャスト。 –

+0

@ JensGustedt一般的なキャストの構文とは異なるため、これは簡単なことではありません。つまり、ハックを追加するには定数を変更する必要があります。そして定数を変更できれば、効果のないキャストを削除する方が良いでしょうか? –

1

Preprossorマクロを書き込み:数字の前に少しだけ+を追加してください。あなたのケース

#define Rep ((int)+6) 

では、プリプロセッサは、そのように最終的な結果が同じ値である0で知らない識別子を置き換えます。

また、Repマクロのキャストはそれ自体ではまったく役に立ちません。とにかく6intです。したがって、ほとんどの場合、接尾辞としてULを組み合わせて、独自のリテラルを持つすべての整数型のキャストを避ける方がよいでしょう。

関連する問題