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_t和int_leastX_t类型,这似乎是一个超级备份方法,以确保最大的可用性.
有任何想法吗?
干杯,我感谢任何输入!
这是由 C 标准管理的;C++ 只是通过显式引用继承了行为。
C 标准说的是:
如果int32_t已定义,则它指的是有符号的 32 位 2 的补码整数。
如果实现提供有符号的 32 位 2 的补码整数类型,则它必须提供int32_t将引用它的 typedef 。
没有任何地方说这个 32 位 2 的补码有符号整数类型必须是int. 从技术上讲,即使int 是32 位 2 的补码整数类型,实现也完全有可能提供不同的 32 位 2 的补码有符号整数类型并定义int32_t为引用该其他类型。
恐怕唯一完全通用的解决方案是列出所有基本类型、固定宽度类型、最小宽度类型和快速最小宽度类型。
对于不那么令人生畏的事情,应该可以检查您希望支持的工具链的文档,以找到它们提供的类型以及它们如何命名。如果这组“您希望支持的工具链”是无限的,我认为没有更简单的方法。
| 归档时间: |
|
| 查看次数: |
429 次 |
| 最近记录: |