这不是我想要创建的宏,但是这种尝试创建在Obj-C和C上下文中工作的自定义日志记录功能的类比说明了这一点:
#define Log(_s, ...) do { \
/* obviously this won't work as written, */\
/* but it's what i'm trying to accomplish: */\
#if (self && _cmd) /* \
LogObjectiveC(_s, ##__VA_ARGS__); \
#else \
LogC(_s, ##__VA_ARGS__); \
#endif \
} while (0)
在此示例中,我们尝试合并使用的两个宏,具体取决于它们的定义位置。 (LogObjectiveC
在Obj-C方法中使用时,LogC
在C函数内部使用。
是否可以检查宏定义中是否存在“隐藏”参数(self
和_cmd
)?
答案 0 :(得分:3)
这是不可能的,因为在宏扩展时不存在方法,函数和参数。在编译器对您的代码执行任何操作之前,预处理器会扩展宏。
我能想到的最接近的事情是在运行时检查__func__
并查看它是以“+ [”还是“ - [”开头,因为所有Objective-C方法都以其中一个开始而不是合法的C或C ++函数可以。
答案 1 :(得分:0)
我将Chuck的标记作为正确答案,谢谢你回答。
再过15分钟的谷歌搜索后,我偶然发现了这个重复的问题:Conditional macro expansion(实际上是@Chuck的建议)