2009-07-20 13 views
9

私はC言語の新機能です。他の人が書いたソースコードをWindowsにコンパイルしたものがあります。windowsとlinuxでコンパイルする

linuxでコンパイルしようとした後、linuxはDWORD、WORD、UINT32をサポートしていないのでエラーが出ます。私は例えば6つのファイルを持っています。 A.h、A.c、B.h、B.c、C.h、C.c.これらのキーワードはすべてのファイルにあります。

私は2つの解決策を考えています。 #defineまたはtypedefのほうが良いでしょう。

1)

typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 

2)私は、これらの宣言を置く必要があり、私は疑問に思って第二部については

#define DWORD unsigned long 
#define WORD unsigned short 
#define UINT32 unsigned int 

。彼らはヘッダーファイルに入るか、ソースファイルに入れなければなりませんか?

たとえば、ヘッダーファイルまたはソースファイルでこれを行う必要がありますか?あなたは解決策自分を発見した上記の提案のための

#ifdef WIN32 
/* windows stuff */ 
#else 
typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 
#endif 

多くのおかげで、

答えて

13

#ifdef WIN32 
/* windows stuff */ 
#else 
typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 
#endif 

は別のヘッダファイル(typedefs.h)でこれを入れて、どこからでもそれを含めます。 typedefは常にプリプロセッサマクロより優先されます。

私の推奨事項:DWORD、WORDなどのWin32タイプは使用しないでください。私は通常、C99標準タイプを使用することを好みます:uint_t、int_tまたはuint16_t、uint32_t

+0

遅いタイピングのために私が得たもの –

+0

クロスプラットフォームのコンパイル性を維持しようとしているのであれば、それをwindows.hという名前のファイルに入れて、それはあなたがそれらの宣言を得るウィンドウ上のファイルだからです。 –

+0

マシンがlong = 8(64ビットマシン)の場合、typedef unsigned int DWORDを使用します。 – Antarus

4

Typedefは間違いなく良いです。 #defineはプリプロセッサマクロであり、基本的にCプリプロセッサが定義に対してグローバルな検索と置換を行うため、意図しない結果を招く可能性があります。 typedefはコンパイラへの指示であり、実行したいことに適しています。

2

#defineは単なる汎用メカニズムですが、typedefはあなたが行っているタイプを定義するためのものです。

私はあなたのコード入れ言う:(一回の#defineガード/#プラグマで)新しいヘッダファイルに

#ifdef WIN32 
/* windows stuff */ 
#else 
typedef unsigned long DWORD; 
typedef unsigned short WORD; 
typedef unsigned int UNINT32; 
#endif 

を、その後、ヘッダまたはソースから、必要なファイルことを含んでいます。

1

typedefを使用すると、結果が実際の型に変換され、構文ツリーに入れられます。 (言い換えれば、コンパイラはそれを知っており、それを言語の一部として認識します)。対照的に、単なるテキスト置換にすぎません。

#defineだから、コンパイラはそれについて知ることはできません。代わりに、それが置換されるものは何でも見るだけです。これにより、コンパイルエラーを見つけるのが難しくなります。

あなたの場合、おそらくtypedefをお勧めします。 #defineはそれを持っていますが、ここではtypedefを使いたくない理由はありません。

他のライブラリでこれらのタイプが定義されている可能性があるので、衝突が発生する可能性があることに注意してください。あなたが本当にクロスプラットフォームになりたい場合は、アプリの名前空間でタイプを定義することをどうにかして考えるかもしれません。他のライブラリとの衝突を最小限に抑えるために、

myapp_dword 
myapp_word 

を使用してください。

最後に、私はあなたが取っているアプローチ全体に対して実際にお勧めします。可能であれば、言語とCの標準ライブラリ(size_tなど)で定義された型名のみを使用するのが最善です。あなたのコードは移植性が高く、頭痛が少なくなります。

+0

こんにちは。言語とC標準ライブラリで定義された型名を言うとき。 DWORD、WORD、およびUINT32をすべて符号なしlong、unsigned shortおよびunsigned intに変更する必要があります。 DWORD、WORDなどを使用する代わりに、これらのタイプはウィンドウとLinuxの両方で動作するためですか?どうもありがとう。 – ant2009

+0

はい、一般的に私が言っていることです。ただし、標準のCライブラリALSOでは、範囲について特定の保証を持つ型が定義されています。 size_tはそのような型の良い例です。 – Christopher

関連する問題