【问题标题】:Workaround for: Use of undeclared identifier '_cmd'解决方法:使用未声明的标识符“_cmd”
【发布时间】:2012-12-01 17:37:28
【问题描述】:

我有一个特殊的NSLog 方法调配器,它将当前方法打印为日志语句的一部分。

对于 Objective-C 方法,我有一个宏使用:NSStringFromSelector(_cmd)

对于非 Objective-C 方法,我有第二个宏使用 __PRETTY_FUNCTION__,因为未定义 _cmd

我现在尝试对两者使用相同的宏,因此我尝试测试它是否已定义并认为我可以这样做:

NSString *command = (&_cmd != nil ? NSStringFromSelector(_cmd) : [NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSUTF8StringEncoding])

但是当宏用于非 Objective-C 方法时,我仍然会收到一些 Use of undeclared identifier '_cmd' 错误。如何进行运行时测试以确定是否定义了 _cmd

【问题讨论】:

    标签: objective-c c logging macros nsstring


    【解决方案1】:

    您无法在运行时测试 _cmd 是否已定义。

    __PRETTY_FUNCTION__ 宏在 Objective-C 方法中定义。在任何地方都使用__PRETTY_FUNCTION__,不要尝试使用_cmd

    例子:

    - (IBAction)mapWasTapped:(UITapGestureRecognizer *)sender {
        NSLog(@"%s", __PRETTY_FUNCTION__);
    }
    

    这是输出:

    2012-12-01 11:45:30.036 TestApp[92581:c07] -[MainViewController mapWasTapped:]
    

    【讨论】:

    • 问题是我只在寻找方法名,而不是类名。我可以尝试一些解析,但不能确定 PRETTY_FUNCTION 是否会返回每次看起来都相同的东西
    • 如果__PRETTY_FUNCTION__-+ 开头,则将所有内容去掉一个空格并去掉结尾的]
    • 我最终使用 NSScanner 来抓取“[”之后的所有内容,然后是“”和“]”之间的所有内容,因为从块调用的方法在“]”之后有一个 __block_invoke_0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多