当int不是int(intX_t)时

Chr*_*s A 8 c++ gcc c++11 gcc4.8

我有一些令人头疼的问题.

基本上我正在尝试使库与不同的Arduino系统兼容(而不是Arduino问题).

我有一种类型不再匹配的情况,因为int它不再等同于其相同的固定宽度类型.在提供的有限环境中(没有stdlib等)我已经为我需要的功能编写了自己的类型特征类.

使用GCC 4.8.1(avr)和Extensa-1x106-GCC(ESP8266)一切正常,但在GCC 4.8.3(SAM,SAMD核心)中没有.

基本上我已经扼杀了我的代码,以显示这个非常基本的代码中的问题(int确认在失败的32位平台编译器上有4个字节):

template < typename T, typename U > struct is_same{ enum { value = false }; };
template < typename T > struct is_same< T, T >    { enum { value = true }; };

void setup() {
  static_assert( is_same<int,int32_t>::value, "Not integer");
}

void loop(){}
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看"正常"C++实现(以上是在Arduino IDE中使用的基本实现):http://cpp.sh/377e

顺便说一下,静态断言也不会在cpp.sh编译器中触发.

是不正确4.8.1,意义int以及int32_t应考虑不同的类型.或4.8.3不正确,如果实现定义的大小相同,它们应该是等效的.

我使用下面的代码来检测任何类型的整数,这是我最初发现错误的地方.

template< typename T >
    struct is_integer{
        enum{
            V8    = is_same< T, uint8_t >::value  || is_same< T, int8_t >::value,
            V16   = is_same< T, uint16_t >::value || is_same< T, int16_t >::value,
            V32   = is_same< T, uint32_t >::value || is_same< T, int32_t >::value,
            V64   = is_same< T, uint64_t >::value || is_same< T, int64_t >::value,
            value = V8 || V16 || V32 || V64
        };
};
Run Code Online (Sandbox Code Playgroud)

我当然可以改变它来检查char,int,long,等..但它仍然需要检查所有固定宽度的变化,最有可能的int_fastX_tint_leastX_t类型,这似乎是一个超级备份方法,以确保最大的可用性.

有任何想法吗?

干杯,我感谢任何输入!

Rei*_*ica 5

这是由 C 标准管理的;C++ 只是通过显式引用继承了行为。

C 标准说的是:

  • 如果int32_t已定义,则它指的是有符号的 32 位 2 的补码整数。

  • 如果实现提供有符号的 32 位 2 的补码整数类型,则它必须提供int32_t将引用它的 typedef 。

没有任何地方说这个 32 位 2 的补码有符号整数类型必须是int. 从技术上讲,即使int 32 位 2 的补码整数类型,实现也完全有可能提供不同的 32 位 2 的补码有符号整数类型并定义int32_t为引用该其他类型。

恐怕唯一完全通用的解决方案是列出所有基本类型、固定宽度类型、最小宽度类型和快速最小宽度类型。

对于不那么令人生畏的事情,应该可以检查您希望支持的工具链的文档,以找到它们提供的类型以及它们如何命名。如果这组“您希望支持的工具链”是无限的,我认为没有更简单的方法。