编辑澄清这个问题,即使我已经得到了答案: 在2台不同的机器(32位微控制器和32位台式机)上使用GCC(相同版本)2个模板,一个参数 int ,另一个参数 int32_t 看到这些类型,32位大小,一台机器不同,另一台机器相同。 问题是"为什么会这样做"。我得到了一个很好的答案( int32_t 类型是一台机器上的 int 类型的typedef,另一台机器上的长类型)。
我有这个模板(占位符)
template<typename T> void PushValue(HSQUIRRELVM vm, T val) {
DEBUG_ERROR("Dummy PushValue called, type is %s\n", typeid(T).name());
}
这些特殊化应涵盖所有整数类型。
template<> void PushValue<int8_t >(HSQUIRRELVM vm, int8_t val );
template<> void PushValue<int16_t >(HSQUIRRELVM vm, int16_t val );
template<> void PushValue<int32_t >(HSQUIRRELVM vm, int32_t val );
template<> void PushValue<int64_t >(HSQUIRRELVM vm, int64_t val );
template<> void PushValue<uint8_t >(HSQUIRRELVM vm, uint8_t val );
template<> void PushValue<uint16_t>(HSQUIRRELVM vm, uint16_t val);
template<> void PushValue<uint32_t>(HSQUIRRELVM vm, uint32_t val);
template<> void PushValue<uint64_t>(HSQUIRRELVM vm, uint64_t val);
我说&#34;应该&#34;因为他们没有抓住&#39; int &#39;和&#39; unsigned int &#39 ;;我不得不加两个。但是,当我添加&#39; 长&#39;版本,所以&#39; long int &#39;等等,编译器抱怨重复,告诉&#39; long int &#39;例如,与&#39; int32_t &#39;相同。 所以...如果它能够知道 long int 与 int32_t 相同,为什么需要 int 和 int32_t 在我的编译器(32位MIPS处理器,GCC)上应该是相同的,作为不同的类型? 第二个问题:是否有可能抓住所有人。应用于一组类型的模板?
编辑:我在桌面(32位和64位版本)上测试了相同的代码,编译器(也是GCC)将 int 和 int32_t 作为 IDENTICAL 类型,为2个添加的模板变体提供重复功能的错误。所以在桌面上我必须删除2个额外的特化,并且在嵌入式代码上我必须添加它们。
编辑: 在32位微控制器上,GCC:
Sizeof(int) :4
typeid(int) :i
Sizeof(int32_t):4
typeid(int32_t):l
Sizeof(long) :4
typeid(long) :l
在64位PC上,GCC
sizeof(int) : 4
typeid(int) : i
sizeof(int32_t) : 4
typeid(int32_t) : i
sizeof(long) : 8
typeid(long) : l
在32位PC上,GCC
sizeof(int) : 4
typeid(int) : i
sizeof(int32_t) : 4
typeid(int32_t) : i
sizeof(long) : 4
typeid(long) : l
从这里可以看出,GCC采用相同大小的不同类型整数,并且在2个不同的平台上,它为int32_t提供了2种不同的含义(MIPS上的长度,i386上的int)
答案 0 :(得分:2)
例如,如果short
和int
都是16位宽,int16_t
将是其中一个的同义词,而不是另一个的同义词。如果要覆盖所有整数类型,请使用char
,short
,int
,long
和long long
的签名/无符号变体。不要使用固定大小的typedef。如您所见,它们并未涵盖所有整数类型。