[英]#ifdef doesn't work. But why?
#ifdef doesn't work. But why?
CGFloat maxScale;
if ( [[UIScreen mainScreen] respondsToSelector: @selector (scale)] == YES )
{
NSLog (@"case1");
#define GLOBAL1
}
else
{
NSLog (@"case2");
#undef GLOBAL1
}
#ifdef GLOBAL1
NSLog (@"first");
maxScale = 1.0 / [[UIScreen mainScreen] scale];
#else
NSLog (@"second");
maxScale = 1.0;
#endif
#undef GLOBAL1
我的日志:case1,第二。 但首先必須是case1。
#define
和#ifdef
是預處理器宏/條件。 這意味着其中包含的邏輯要在編譯代碼之前先進行編譯。 它實際上不是代碼的一部分。
[編輯]
這就是預處理器在讀取代碼時所看到的。
#define GLOBAL1
#undef GLOBAL1
#ifdef GLOBAL1
//...
#else
//...
#endif
#undef GLOBAL1
忽略所有其他代碼和邏輯。
這是編譯器生成的實際代碼輸出:
if ( [[UIScreen mainScreen] respondsToSelector: @selector (scale)] == YES )
{
NSLog (@"case1");
}
else
{
NSLog (@"case2");
}
// because the pre-processor #undef GLOBAL1
NSLog (@"second");
maxScale = 1.0;
預處理器代碼是“執行的”,告訴編譯器如何編譯,並且在運行時不會被使用或運行。
希望有幫助!
預處理程序並不關心#define
是否位於已編碼的if語句中-它在代碼之前被處理,僅關心其他預處理程序定義。 您不能將#defines
和其他預處理程序命令(例如#undef
)用作代碼-每次代碼進入條件分支時都不會命中它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.