【发布时间】:2010-05-24 11:04:20
【问题描述】:
使用宏来创建方法名称通常有效吗?我的意思是...实际上只是在编译器实际运行之前进行简单的文本替换,对吧?
【问题讨论】:
标签: iphone objective-c macros
使用宏来创建方法名称通常有效吗?我的意思是...实际上只是在编译器实际运行之前进行简单的文本替换,对吧?
【问题讨论】:
标签: iphone objective-c macros
是的,它是有效的;宏扩展发生在编译器甚至读取代码之前。主要限制是不能在预处理器指令中嵌入预处理器指令。所以,例如:
// This is ok:
#define PREFIX(X) this_name_is_prefixed_ ## X
// ...
- (void) PREFIX(doSomething):id;
// ...
// But this isn't:
#define IMPORT(X) #import X
IMPORT(<Foundation/Foundation.h>) // <= Don't expect this to work
除了“#import”指令外,Objective-C 的预处理器与C preprocessor 基本相同。 (“#import”类似于“#include”,除了#import 意味着只包含一次,因此只包含在#import 中的标头不需要预处理器保护)。
【讨论】:
没有什么可以阻止这一点。它甚至是常用的(虽然我不知道 iphone),例如,在设备驱动程序实现中。在这种情况下,宏用于生成样板代码,并且要让这个样板与您的代码进行通信,您必须猜测正确的函数名称(不建议),或者使用生成宏,例如 USB_ATTACH(uthum) 来生成签名uthum 驱动程序的附加方法。
【讨论】: