2014-10-07 23 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

相关问题