我有功能:
void func(unsigned int event) {
printf("%u %u\r\n", typeid(event), typeid(unsigned int&));
// prints 5338164 0
printf("%u %u\r\n", typeid(event), typeid(unsigned int));
// prints 21525556 0
}
假设这个问题与RTFM有关,但我多次重读typeid()
手册页,但找不到答案。
这段代码有什么问题?为什么%u
不相等?还有为什么当我在代码中更改第二个参数时它首先更改%u
。
感谢。
答案 0 :(得分:3)
尝试
printf("%s %s\n", typeid(event).name(), typeid(unsigned int).name());
正如之前的回复所说,typeid()的结果是不透明的,不能打印,好像它是一个int。这段代码编译的事实只是C输入错误的结果。
答案 1 :(得分:3)
因此typeid会返回std::type_info而不是 unsigned int 。这似乎是在Visual Studio中编译的,但不清楚结果的含义。此代码不会在gcc
和clang
中编译。
使用printf
的错误格式说明符是未定义的行为,因此行为实际上是不可预测的。 Visual Studio不必为此生成警告,但这样做有助于防止此类问题。由于std::type_info
不是一个简单的类,它是在变量函数中使用的实现定义行为,clang
产生此警告:
error: cannot pass non-trivial object of type 'const std::type_info' to variadic function; expected type from format string was 'unsigned int' [-Wnon-pod-varargs]
printf("%u %u\r\n", typeid(event), typeid(unsigned int));
~~
使用返回 const char 的std::type_info::name将得到您期望的结果:
printf("%s %s\n", typeid(event).name(), typeid(unsigned int&).name());
和Visual Studio的结果:
unsigned int unsigned int unsigned int unsigned int