【问题标题】:Why I get: returning const char * from a function with result type char * discards qualifiers为什么我得到:从结果类型为 char * 的函数返回 const char * 会丢弃限定符
【发布时间】:2011-12-23 16:34:01
【问题描述】:

我需要将NSString 作为char * 返回:

char *inboxPath (void) 
{ 
    NSURL * url = [[[[NSFileManager defaultManager] 
                 URLsForDirectory:NSDocumentDirectory 
                 inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"inbox.txt"];
    return [[NSString stringWithFormat:@"%@", url] UTF8String]; 
}

我得到:从结果类型为“char *”的函数返回“const char *”会丢弃限定符

为什么我会得到这个以及如何解决它?
显然我对 C 了解不多,有没有更简单的方法可以做到这一点?

【问题讨论】:

    标签: objective-c c nsstring char


    【解决方案1】:

    功能:

    char* inboxPath (void);
    

    返回char*,而-[NSString UTF8String] 返回const char*。您要删除的限定符是const。为了解决这个问题,你应该声明你的函数:

    const char* inboxPath (void);
    

    改变不可变 (const) 数据是引入未定义行为的一种常见方式,因此您绝对希望避免删除 const 限定符。

    如果您需要可变的char 缓冲区,请复制-[NSString UTF8String] 返回的utf8 字符串。

    【讨论】:

    • 注意:“返回的 C 字符串是一个指向字符串对象内部结构的指针,它的生命周期可能比字符串对象的生命周期短,而且肯定不会有更长的生命周期。因此,如果需要将 C 字符串存储在调用此方法的内存上下文之外,则应该复制它。” – NSString
    【解决方案2】:

    将限定符添加到函数中的返回值类型:

    const char *inboxPath(...)
    

    UTF8String 返回 const char *,因此您可能希望在函数中返回相同的类型。

    【讨论】:

      猜你喜欢
      • 2014-02-20
      • 2022-01-16
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 2013-11-14
      • 1970-01-01
      • 2017-03-12
      相关资源
      最近更新 更多