打印没有铸件的枚举可以在C++中吗?
Is printing an enum without a cast okay in C++?
#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));
}
相关文章:
- 类型总是使用其大小存储在内存中吗
- 我应该将除 .cpp 以外的其他文件添加到 git 中吗?
- 不必要的C++代码最终会出现在我完成的程序中吗?
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 打印没有铸件的枚举可以在C++中吗?
- 字符串变量,比如说"字符串str",可以直接复制到数组中吗?
- 我们可以将集合的值存储在变量中吗?就像我们可以将数组的值存储在变量中一样
- "x"的所有元素都存在于"y"(排序向量)中吗?
- 如果我从不调用这个方法,我可以把static_assert放在类方法中吗
- 你能把整个网页嵌入到c++源代码中吗
- 我可以使用istream_iterator将<char>一些 istream 内容复制到 std::string 中吗?
- 可以将模板化的 lambda 存储到 std::function 中吗?
- typedef 应该同时在类定义和类声明中吗?
- 我们可以动态地将操作插入到我们的函数中吗?
- 我可以将函数的输出参数存储到unique_ptr中吗?
- 可以将逗号和参数传递到C++宏中吗?
- 我可以停止 GCC 将标准库名称包含在全局命名空间中吗?
- 如果我不将预先编写的字符串保存到变量,它还在内存中吗?
- 我可以在一行代码中将向量中与条件匹配的所有元素插入到集合中吗?
- 我可以在标头中将一个命名空间"import"到另一个命名空间中吗?