【问题标题】:What is the assign-enum warning in clang?clang 中的赋值枚举警告是什么?
【发布时间】:2013-08-28 09:03:52
【问题描述】:

我正在经历AFNetworking 的实现,我发现了这个

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wassign-enum"
[request setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:0 error:&error]];
#pragma clang diagnostic pop

(AFHTTPClient:489-492)

assign-enum 警告显然被关闭了,但我想知道这是什么意思。

在这种情况下,clang 抛出的警告是什么?

【问题讨论】:

    标签: objective-c clang afnetworking


    【解决方案1】:

    在没有 clang pragma 的情况下发出的警告是:

    整数常量不在枚举类型范围内 'NSJSONWritingOptions'(又名'枚举 NSJSONWritingOptions')

    查看NSJSONWritingOptions的声明,我们看到0没有定义值:

    enum {     NSJSONWritingPrettyPrinted = (1UL << 0) }; typedef NSUInteger NSJSONWritingOptions;
    

    文档确实建议传递 0,但没有定义像 NSJSONWritingNoOption = 0 这样的选项,因此我们将常量 (0) 分配给未将 0 定义为可能值的枚举类型。

    【讨论】:

    • 谢谢,现在说得通了。我仍然不明白为什么没有定义像NSJSONWritingOptionsNone = 0 这样的东西,这可能会更优雅。无论如何,这是一个不同的问题。 +1
    • 啊,我在路上偶然发现了这个。在 iPhone 上。
    • 一方面,从实现 API 的角度来看,拥有它是没有意义的:没有人会检查像 if (passedInOptions &amp; NSJSONWritingOptionsNone) {//purely default case } 这样的东西,因为那是行不通的,而且无论如何都是荒谬的。它总是if (passedInOptions &amp; NSJSONWritingOptionsCustomStuff) {// do custom stuff first} ... //default stuff here。但出于这个原因,将它排除在外绝对是 API 设计的懒惰。
    • 同意。我会考虑将其转发到 github。不是很重要,但该库是如此的瑰宝,很遗憾看到它被编译器编译指示污染。
    • @GabrielePetronella 对于 NSJSONWritingOptions,Mattt Thompson 无能为力,因为它是 Foundation 的一部分。不过,将有问题的文字转换为正确的类型会更好:options:(NSJSONWritingOptions)0
    【解决方案2】:

    如果您删除编译指示并构建它,您将看到警告。 除此之外,您还需要查看 clang 手册。

    【讨论】:

    • 我用谷歌搜索了一段时间,但找不到此类警告的描述。任何指向相关文档的指针将不胜感激。
    • 我看到很多带有这个标志的谷歌搜索结果。 Clang 旨在实现大量 GCC 兼容性,并且标志很多,参数也很多。请参阅此 SO 帖子stackoverflow.com/questions/7880812/…
    • 我已经看过那个帖子了。它指向一个clang标志列表,但没有描述。我错过了什么吗?
    • 我很愚蠢,我错过了实际答案。无论如何clang -cc1 --help | grep assign-enum 不会返回任何结果。
    • 似乎确实记录得很差,但也许这个线程也有帮助......lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20130603/…您实际上可能需要深入研究clang源,但肯定似乎是关于使用枚举值的asginment的警告。他们正在使用更多警告,但在这里选择忽略这一警告。
    猜你喜欢
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多