typeid结果不匹配

时间:2014-07-30 15:32:54

标签: c++ rtti typeid

我有功能:

 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。 感谢。

2 个答案:

答案 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中编译的,但不清楚结果的含义。此代码不会在gccclang中编译。

使用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