打印没有铸件的枚举可以在C++中吗?

Is printing an enum without a cast okay in C++?

本文关键字:C++ 中吗 枚举 打印      更新时间:2023-10-16
#include <stdio.h> 
enum class TEST_ENUM{
VALUE =1,
};
int main( ){
// Gcc will warn. 
printf("%u", TEST_ENUM::VALUE);
// Both clang and gcc are happy. 
printf("%u", uint32_T(TEST_ENUM::VALUE));
}

神螺栓链接

在上面的示例中,gcc 将发出以下诊断:

<source>:8:12: warning: format '%u' expects argument of type 'unsigned int', but argument 2 has type 'TEST_ENUM' [-Wformat=]
printf("%u", TEST_ENUM::VALUE);

无论启用的编译器版本或警告如何,我似乎都无法发出相同的诊断。由于这是一个警告而不是错误,我假设两者都符合标准。为什么 gcc 抱怨而 clang 不会?海湾合作委员会在这里是否过于谨慎,还是真的有什么值得警告的地方?

来自 cpp首选项:

... - 指定要打印的数据的参数。如果默认转换后的任何参数不是相应转换说明符所需的类型,或者参数少于格式所需的参数,则行为未定义。如果参数多于格式要求的参数,则计算并忽略无关参数

海湾合作委员会在这里是否过于谨慎,还是真的有什么值得警告的地方?

一点也不过分。您传递的参数类型错误!

由于这是一个警告而不是错误,我假设两者都符合标准。为什么 gcc 抱怨而 clang 不会?

当代码具有未定义的行为时,编译器不需要发出任何诊断。海湾合作委员会只是在这里对你很好。

如果您被迫使用类型不安全的 API,您可以随时将其包装到类型安全的东西中:

void Log(const TEST_ENUM& x) {
the_actual_logging_api( "%u", static_cast<std:underlying_type<TEST_ENUM>>(x));   
}