【问题标题】:How test if a void pointer is a struct or string?如何测试 void 指针是结构还是字符串?
【发布时间】:2012-03-06 03:25:42
【问题描述】:

我可以测试空指针的类型吗?我想解决这个问题:

void log(void *test) {
    if (is a struct) {
        NSLog(test);
    } else {
        printf("%s\n", test);
    }    
}

log(@"This send a struct (NSString)");
log("This send normal string");

有简单的测试方法吗?

【问题讨论】:

  • 这些标签使这个问题完全模棱两可。
  • 你为什么用 3 种不同的语言标记这些?每种语言都有不同的方法来实现这一点。另外,您为什么要这样编写 Log 方法?而是声明两个不同的 log() 方法,每个方法都有不同的输入类型 (NSString) 和 (char*)
  • A void* 适用于所有 3 种语言。我认为标记没有任何问题。
  • @Rodrigo,谁教你的?那是三种不同的语言。时期。 TheBuzzSaw - 但人们倾向于用所有标签标记所有 c/c++/obj-c 问题(或者只使用 c 和 c++ 标签 - 只看到一次合理的问题)。 Obj-c和c++都是基于C的,但是C不是它们的子集!
  • @TheBuzzSaw:适用于所有三种语言的单一解决方案是什么?

标签: objective-c


【解决方案1】:

不,您不能对此进行测试。 void* 只是一个可以存储任何东西(甚至什么都没有)的内存地址。它的含义完全依赖于实现,只有原始程序员(或文档)知道。

【讨论】:

    【解决方案2】:

    实际上没有办法以非特定于实现的方式进行这种检测,因为当您将 NSString 强制转换为 void* 时,您会丢弃所有输入信息并将其转换为“指向内存的无类型指针”。

    我不知道你为什么想要这种功能,但如果它在两个对象之间,你应该使用“id”而不是 void*,因为这样会保留所有类型信息。

    在这个具体的例子中,将“log”作为一个重载函数可能更有意义,从而知道参数编译时间的类型。

    【讨论】:

    • 如果你有一个指向 object 的指针,可以通过发送消息(-class-isKindOfClass:-isMemberOfClass:)来找出它的类,而不管指针本身的类型。一个是运行时信息,另一个是编译时信息。
    • @JoshCaswell 是的,但如果您确定它们都是对象,我看不出强制转换为比 id“低”的类型的原因。当您转换为 void* 时,您或多或少地故意丢弃您正在处理的对象的信息。
    • 你是对的,这样做的理由很少,你的第二段通常是很好的建议,但是,例如,我最近在玩 NSInvocation 和 libffi,这两个都需要对象偶尔通过void * 移动。其他 C 风格的接口可能需要相同的。
    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2016-03-21
    • 1970-01-01
    相关资源
    最近更新 更多