CからC++にコードを移植しています。変換中に私が遭遇した:
uint128_t
はタイプに名前を付けません
私のコンパイラ:gccバージョン5.2.1
私のオペレーティングシステム:Ubuntu 15.1
これはCとして問題なくコンパイルされ、stdint.h
を含めることで解決すると思いましたが、そうではありませんでした。これまでのところ、このエラーに関する情報はあまりないようですので、他に何も試していません( example )。 uint128_t
はこのプログラム全体で使用され、ビルドに不可欠です。したがって、それを削除することはできず、別の整数型を使用するかどうかはわかりません。
以下は、それがどこでどのように使用されるかの例です。
union {
uint16_t u16;
uint32_t u32;
uint128_t u128;
} value;
uint128_t
を定義しても大丈夫でしょうか、それともコンパイラを調べる必要がありますか?
GCCには、タイプ ___int128
_、_unsigned __int128
_ 、___int128_t
_、および___uint128_t
_の組み込みサポートがあります(最後の2つは文書化されていません)。それらを使用して、独自のタイプを定義します。
_typedef __int128 int128_t;
typedef unsigned __int128 uint128_t;
_
または、__mode__(TI)
を使用できます。
_typedef int int128_t __attribute__((mode(TI)));
typedef unsigned int uint128_t __attribute__((mode(TI)));
_
ドキュメント の引用:
TImode
「テトラ整数」(?)モードは16バイトの整数を表します。
16バイト= 16 * CHAR_BIT> = 128。
これは
stdint.h
を含めることで解決されると思いましたが、そうではありませんでした。
まあ、そうではないかもしれません。
まず、C++ 14の18.4.1章のC++ヘッダーcstdint
を確認します。
namespace std {..... typedef unsigned integer type uint8_t; // optional typedef unsigned integer type uint16_t; // optional typedef unsigned integer type uint32_t; // optional typedef unsigned integer type uint64_t; // optional .....
そして、
ヘッダーは、C標準の7.18と同じすべての関数、型、およびマクロを定義します。 [..]
次に、C11
標準の§7.20.1.1の章を引用します(emphasis mine)
Typedef名
uintN_t
は、幅N
でパディングビットのない符号なし整数型を指定します。したがって、uint24_t
は、正確に24
ビットの幅を持つこのような符号なし整数型を示します。これらのタイプはオプションです。ただし、実装が8、16、32、または64ビットの幅、パディングビットなし、および(符号付きタイプの場合)2の補数表現を持つ整数タイプを提供する場合、対応するtypedef名を定義します。
そのため、ここで2つのことがわかります。
固定幅int
sのサポートを提供するための実装は必須ではありません。
標準では、幅が64
に制限されています。それ以上の幅を持つことは、再び標準では義務付けられていません。使用中の環境のドキュメントを確認する必要があります。
他の回答で指摘されているように、C++標準では、128ビット整数を使用可能にする必要はなく、uint128_t
として存在する場合でもtypedef
edする必要はありません。コンパイラー/アーキテクチャーが128ビット整数をサポートしておらず、それらが必要な場合は、boostを使用してそれらをエミュレートできます。
ブーストライブラリは、使用可能な場合、ネイティブタイプを自動的に使用すると思います