私はいくつかの頭痛がここで問題を引き起こしている。intがint(intX_t)でない場合
私は基本的に、異なる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(){}
あなたは 'を表示することができますここでの「通常の」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
};
};
もちろん、私はなど、int
、char
をチェックするlong
それを変更することができます..しかし、それはまだスーパーのように思われる、すべての固定幅の変動と最も可能性の高いint_fastX_t
とint_leastX_t
種類をチェックする必要があります最大のユーザビリティを確保するための冗長な方法です。
アイデア?
乾杯、私は任意の入力を感謝します!
問題のツールチェーンはどこかで入手できますか? – melak47
組み込み環境で[boost](http://www.boost.org/doc/libs/1_59_0/libs/integer/doc/html/boost_integer/traits.html)を使用できますか? –
@ melak47ええ、あなたは[Arduino IDE](https://www.arduino.cc/en/Main/Software)をダウンロードすることができ、ツール - >ボード - >ボードマネージャからSAMを選択してインストールするか、 SAMDコアを使用して、残りの作業を行います。次に、ツール - >ボードリストからゼロ(SAMD)または期限(SAM)を選択します。 (それは痛みですが、初心者のために設計されています)。 AVR 4.8.1コアはデフォルトで提供されています。 –