在 GCC 中使用不同枚举类型分配或执行算术时如何发出警告?

Posted

技术标签:

【中文标题】在 GCC 中使用不同枚举类型分配或执行算术时如何发出警告?【英文标题】:How to warn when assigning or performing arithmetic with different enum types in GCC? 【发布时间】:2018-01-01 08:41:52 【问题描述】:

虽然我知道这是不区分枚举类型的有效 C。

GCC 确实有 -Wenum-compare(我正在使用)并且按预期工作。

我尝试使用-Wconversion,但这没有任何区别。

赋值和算术运算符(+/-/&/|...等)如何也产生警告? (赋值,或...等)


    enum Foo f = SOME_VALUE;
    enum Bar b = SOME_OTHER_VALUE;

    if (f != b) 
        /* this warns! */
    

    f = b;  /* <-- how to warn about this? */
    f |= b;  /* .. and this? */



注意事项:

切换到 C++ 不是一种选择(如其他答案中所建议)。 This question 密切相关,但它不是重复的,因为它是关于传递参数而不是算术。

【问题讨论】:

即使使用-Wall -Wextra -pedantic 也不会发出警告。我猜你将不得不使用额外的检查工具(这很糟糕,因为没有什么比使用编译器更好) -Wenum-compare 包含在Wall 中,但它只检查比较(如所述)。你喜欢Wenum-assign :) enum 只不过是命名整数值的语法糖而已,您无能为力。只是出于学术兴趣,我曾经创建了一些enum classes like code,但我怀疑它在实践中是否有用。 GCC 一直在添加有用且实用的警告(例如-Wimplicit-fallthrough)。也许他们会考虑-Wenum-conversion @ideasman42 关于您的编辑:Jean-François 不建议切换到 C++,只是为了 (ab) 使用 C++ 编译器进行额外的代码检查步骤。 . 【参考方案1】:

根据this answer,只有 clang 支持所需的行为。

有 some approaches 在 C 中模拟强类型枚举,但它们似乎有各种限制。

【讨论】:

以上是关于在 GCC 中使用不同枚举类型分配或执行算术时如何发出警告?的主要内容,如果未能解决你的问题,请参考以下文章

C 数据类型

C 数据类型

C 数据类型

如何在C ++中将枚举导入不同的命名空间?

在对浮点数执行平方和平方根时:表达式必须具有整数或无作用域枚举类型

如何使用 Enum 类型的字段执行 Typesafe JSON?