簡體   English   中英

#ifdef不起作用。 但為什么?

[英]#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM