2014-10-07 22 views
-1

我知道我可以使用預處理宏有條件地編譯某些方法調用,例如:C預處理指令,條件編譯方法用方括號調用

#if SOMETHING 
#define fmod(...) 
#endif 
... 
fmod(34.0, 452.0); //this line doesn't get compiled if SOMETHING != 0. 

我可以使用同樣的程序條件編譯方法與要求打開和關閉括號?

說我想所有來電條件編譯的類MyClass

[MyClass doSomething]; 
[MyClass doSomethingElse]; 

#define MyClass[...]生產:

[ doSomething]; 

這就是一個錯誤。有什麼想法嗎?

+0

似乎是一個[XY問題(http://meta.stackexchange.com/questions/66377/what-is -the-XY-問題)?你通過有條件地編譯發送給'MyClass'的消息試圖完成什麼? – 2014-10-07 21:12:09

+0

看,在Stackoverflow上歡迎XY問題,因爲它們是[「實際的,基於你面對的實際問題的可回答的問題」](http://blog.stackoverflow.com/2011/01/real-questions-have-answers /),除了它們在智力上有價值的事實。此外,這不是一個XY問題,因爲我的問題是**有條件地編譯發送到'MyClass'的消息。 – Eric 2014-10-07 21:49:39

+0

僅供參考,在C++和C中都不支持方括號表示法。您正在編寫哪種語言? – 2014-10-07 21:52:21

回答

1

這是一種變通方法依靠事實,即調用方法上nil沒有操作

@interface MyClassImpl : NSObject 

+ (void)doSomething; 

@end 

#if SOMETHING 
#define MyClass MyClassImpl 
#else 
#define MyClass ((Class)Nil) 
#endif 
+0

不錯的嘗試,但不起作用,因爲你不能發送消息到'無'在建立時。你的代碼編譯爲'[Null doSomething];'並且出現構建錯誤:'Bad *'void *'' – Eric 2014-10-07 22:23:11

+0

@Eric我不知道爲什麼'Nil'有'void *'而不是'Class ',但你能嘗試更新的答案嗎?否則,你可以使用'Class globalNilClass = Nil; #define MyClass globalNilClass' – 2014-10-07 22:24:27

0

你不會有任何運氣用宏重載方括號,但是你可以用不同的語法充實你的宏。有條件地定義一個需要參數的宏。在一種情況下,宏將解析爲參數,在另一種情況下,宏將解析爲空白。

(編輯使用可變參數宏)

#define COMPILE_CONDITIONAL 

#if defined(COMPILE_CONDITIONAL) 
    #define conditional(...) __VA_ARGS__ 
#else 
    #define conditional(...) 
#endif 

然後用例看起來像:

conditional(fmod(34.0, 452.0)); 

conditional(MyClass doSomething); 
conditional(MyClass doSomethingElse); 

你最終可能會使用比「有條件的」打字上每一個較短的宏線路變得老舊。

+0

當我嘗試你的代碼時,我得到'使用未聲明的標識符'x''錯誤。 – Eric 2014-10-07 21:52:55

+0

你需要讓它具有可變宏,允許','宏內 – 2014-10-07 22:05:47

+0

@BryanChen是正確的,我忽略了逗號... – iwolf 2014-10-07 22:07:38

相關問題