2009-05-13 12 views
2

まあ、私はいくつかのJavaやってる - 型マッピングが使用されているwerid Cの統合、およびthroughtのCライブラリ(それらのtheresの多くを;)):組み込み型のtypedef(または#define)の使用 - 賢明な理由はありますか?

#define CHAR  char     /* 8 bit signed int   */ 
#define SHORT  short     /* 16 bit signed int   */ 
#define INT   int      /* "natural" length signed int */ 
#define LONG  long     /* 32 bit signed int   */ 
typedef unsigned char BYTE;   /* 8 bit unsigned int   */ 
typedef unsigned char UCHAR;   /* 8 bit unsigned int   */ 
typedef unsigned short USHORT;   /* 16 bit unsigned int   */ 
typedef unsigned int  UINT;   /* "natural" length unsigned int*/ 

それらを使用しない正当な理由があるの? charはすぐに再定義されるようなものではありません。

私は考えることができる

  1. ライティングプラットフォーム/コンパイラポータブルなコードは(タイプのサイズはC/C++でunderspecifiedされる)
  2. 省スペースおよび組み込みシステム上の時間 - 短い配列の上にあなたがループの場合255ビット以上の8ビットマイクロプロセッサ書き込み:

    for(uint8_t ii = 0; ii < len; ii++) 
    

    は、スピードアップが可能です。

答えて

2

C標準では、整数型のサイズの数は指定されていません。コンパイラとコードが実行されるプロセッサに依存します。

したがって、移植性を最大限に高めるには、それぞれのタイプがその特定のターゲットにどの程度の大きさであるかを示す標準名を使用するヘッダーを使用することをお勧めします。

MISRA-Cなどは、uint16_t、sint32_tなどを使用します。 u16、s32も使用中です。

について#define v typedef:typedefを使用して、コンパイラーによるタイプ検査を実施します。

+0

uint16_tなどについては、大学でマイクロプロセッサーをプログラミングするときにのみ使用しましたが、スペース/メモリを節約するために明示的に使用しました。そのような255バイト未満の配列をループするとき(ほとんどすべてでした) uint8_t(マイクロプロセッサは8ビットのものでした)。 移植性のためではありません。 –

+0

実際、彼らはその目的にも役立ちます。 –

4

これはまさにその理由です。 Cは多くのシステムで使用されており、実際にはタイプのサイズが実際にプラットフォーム/ハードウェア/バージョン間でどのくらいの頻度で変更されるのかが実際には邪魔になります。まあ

+1

しかし、stdint.h(http://www.opengroup.org/onlinepubs/000095399/basedefs/stdint.h.html)は、これを行うためのもっと簡単で簡単な方法を提供します。 –

+0

私はそれが理想的ではないと言っているのですが、なぜそれが行われたのか説明しています。これは20年以上前の決定です。私は、サイズはそれよりはるかに大きな要因だったと想像しています...それとも、単に間違っていた可能性があります。誰が今知っていますか? – Serapth

+0

stdint.hはC99にのみあります。すべてのコンパイラがそれを提供するわけではありません。 –

1

あなたがより多く存在していると述べたよう.. は、これらのいくつかは、INT32のようでなければならず、デフォルトでINT64

int型には、標準的な大きさを持っていません。 32ビットまたは64ビットにすることができます。

上記のように宣言すると、移植可能なコードを書くのに役立ちます。ここでは、INT32が常に32ビットintを与えるという安全な前提ができます。

+0

ポータブル32ビット整数型が必要な場合は、int32_t(http://linux.die.net/man/3/int32_t)を使用します。私の意見では、INTのような定義は通常無意味です。 –

0

オペレーティングシステム間の移植性だけでなく、32ビットと64ビットなどのアーキテクチャ間でも移植性があります。

64ビットの連続フラグを格納するために2つの符号なし整数を使用していた32ビットマシンで、ネットワークコードを書き上げたとします。 64ビットマシンで同じコードをコンパイルしても、ほとんどの64ビットマシンがintに8バイトを割り当てているため、128ビットの割り当てと32ビットのギャップ2組の32ビットフラグ。それは移植性のために明らかに悪いことです。

多くの場合、uint16_tやuint32_tのように、その変数に割り当てられたメモリのサイズを具体的に参照するtypedefが表示されます。これらは、特定のアーキテクチャー上の無署名のストレージをどのようなタイプにしてもtypedefされます。そのため、コードはオペレーティングシステムやアーキテクチャ全体で一貫性を保つことができます。

1

Q:typedefsまたは#definesを使用していますか?

A:まあ、定義はプリプロセッサディレクティブですが、typedefは実際にはコンパイラによって実行されます。個人的には、型定義にtypedefを使用し、定数や関数ラッパーなどを定義する方が好きです。

関連する問題