ObjC宏 - 我可以包括检查以查看当前范围内是否定义了变量?

时间:2014-01-15 23:34:22

标签: objective-c c macros llvm

这不是我想要创建的宏,但是这种尝试创建在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)?

2 个答案:

答案 0 :(得分:3)

这是不可能的,因为在宏扩展时不存在方法,函数和参数。在编译器对您的代码执行任何操作之前,预处理器会扩展宏。

我能想到的最接近的事情是在运行时检查__func__并查看它是以“+ [”还是“ - [”开头,因为所有Objective-C方法都以其中一个开始而不是合法的C或C ++函数可以。

答案 1 :(得分:0)

我将Chuck的标记作为正确答案,谢谢你回答。

再过15分钟的谷歌搜索后,我偶然发现了这个重复的问题:Conditional macro expansion(实际上是@Chuck的建议)