在 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 中使用不同枚举类型分配或执行算术时如何发出警告?的主要内容,如果未能解决你的问题,请参考以下文章