C预处理程序指令,用方括号有条件地编译方法调用

时间:2014-10-07 21:00:52

标签: objective-c c-preprocessor preprocessor-directive

我知道我可以使用预处理器宏来有条件地编译某些方法调用,例如:

#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];

这是一个错误。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这是一种解决方法,依赖于nil上的调用方法无操作

@interface MyClassImpl : NSObject

+ (void)doSomething;

@end

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

答案 1 :(得分: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);

你可能最终会使用一个比“条件”类型更短的宏,它会在每一行都变得很快。