爲什麼這個代碼給出了一個錯誤:與#如果鑄造用C
#include <stdio.h>
#define Rep (int)6
int main(){
#if Rep==6
printf("T");
#else
printf("F");
#endif
return 0;
}
- 爲什麼會拒絕鑄造?
- 它是'預處理器錯誤'還是'編譯器錯誤'?
爲什麼這個代碼給出了一個錯誤:與#如果鑄造用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」或cast操作符。 (a)你錯過了所需的'#include',(b)'void main()'應該是'int main(void) (c)輸出應該以換行符結束:'printf(「T \ n」);'。編譯器不需要診斷所有這些問題,但是您絕對應該修復它們。 –
@nielsbot 來自Eclipse IDE的錯誤:「令牌之前缺少二元運算符」6「」 –