2

Qtのドキュメントには次のように書かれています:

typedef qint8

signed char の Typedef。この型は、Qt がサポートするすべてのプラットフォームで 8 ビットであることが保証されています。

typedef qint16

signed short の Typedef。このタイプは、Qt がサポートするすべてのプラットフォームで 16 ビットであることが保証されています。

typedef qint32

signed int の Typedef。このタイプは、Qt がサポートするすべてのプラットフォームで 32 ビットであることが保証されています。

typedef qint64

long long int の Typedef (Windows では __int64)。このタイプは、Qt がサポートするすべてのプラットフォームで 64 ビットであることが保証されています。

タイプは次のように定義され qglobal.hています。

/*
   Size-dependent types (architechture-dependent byte order)
   Make sure to update QMetaType when changing these typedefs
*/
typedef signed char qint8;         /* 8 bit signed */
typedef unsigned char quint8;      /* 8 bit unsigned */
typedef short qint16;              /* 16 bit signed */
typedef unsigned short quint16;    /* 16 bit unsigned */
typedef int qint32;                /* 32 bit signed */
typedef unsigned int quint32;      /* 32 bit unsigned */
//....

qint32しかし、32ビット長であるという保証がない場合、(たとえば)どのようにして常に32ビット長になることができるのか疑問に思っていますint私の知る限り、64 ビット アーキテクチャintでは s の長さは 64 ビットです (または少なくとも可能です)。【追記:間違えました。以下のコメントを参照してください。]

どのようにサイズを保証できますか? なぜ彼らはstdint(そして Windows プラットフォームでは __intN を) 使用しないのでしょうか?

4

2 に答える 2

3

どのようにサイズを保証できますか?

彼らは、上記の定義が機能することを知っている特定のプラットフォームをターゲットにしています。Qt は他のプラットフォームを気にせず、他のプラットフォームは Qt を気にしません。したがって、常に機能するとは限りません。しかし、それが機能しない場合は、Qt も機能しません。

stdint (および Windows プラットフォームでは __intN) を使用しないのはなぜですか?

typedef を持つプラットフォームに条件付きで標準ヘッダーを含め、そうでないプラットフォーム (VS2005 など) のフォールバックを維持するより<stdint.h>も、独自のプロジェクトでtypedef を維持する方が簡単な場合があります。

于 2012-05-21T20:36:47.120 に答える
1

Qt は多くのプラットフォームをサポートしていますが、重要なのはプラットフォームの 64 ビット データ モデル (より正確には、コンパイラとプラットフォームのデータ モデル) です。

ほとんどの一般的な 64 ビット プラットフォームは、何らかの形式の LP64 データ モデルを実装しているため、32 ビット整数を使用します。ILP64 ベースのデータ モデル (ILP64、SILP64 など) は、int を 64 ビットとして定義します。しかし、Qt がこれらのプラットフォームをサポートしているとは思えません。

ILP64 wiki ページとPVS-Studio のこのサポート ページをチェックしてください。いくつかの優れた技術情報があります。

于 2012-05-21T20:42:55.617 に答える