2016-04-22 52 views
2

爲什麼這個代碼給出了一個錯誤:與#如果鑄造用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」或cast操作符。 (a)你錯過了所需的'#include ',(b)'void main()'應該是'int main(void) (c)輸出應該以換行符結束:'printf(「T \ n」);'。編譯器不需要診斷所有這些問題,但是您絕對應該修復它們。 –

+0

@nielsbot 來自Eclipse IDE的錯誤:「令牌之前缺少二元運算符」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作爲後綴進行組合。