2011-07-12 21 views
4

winnt.hヘッダーに定義されている大文字のVOIDマクロが存在する理由を知りたい人は誰ですか?winnt.hの大文字VOIDマクロとINT typedefの目的

事項をさらに混乱させるために、VOIDCHARSHORTINT、およびLONG一方のtypedefは、マクロです。

winnt.hから関連の抜粋を参照してください:

#ifndef VOID 
#define VOID void 
typedef char CHAR; 
typedef short SHORT; 
typedef long LONG; 
#if !defined(MIDL_PASS) 
typedef int INT; 
#endif 
#endif 

VOID* pointerの代わりvoid* pointerを行うための、おそらく歴史的な理由?

EDIT:もっと厄介で何が今日のプログラミングのWindowsを実行するとき、人々はvoidの代わりにVOIDを使用して確認することです。また、MSDNドキュメントの一部として見ることもできます。 http://msdn.microsoft.com/en-us/library/bb205867(v=vs.85).aspx

答えて

6

元々の理由は、もともとはWin32 APIはもともとは言語に依存しないと考えられていたため、名前付け規則に従って独自の名前を作成し、そのC実装を提供しました。実際には、彼らが定義したものの多くは、他の言語を使っている大部分の人には無視される傾向があります。

は限りVOIDではなくtypedef#defineである理由として、それは非常に単純です:必要なtypedeftypedef void VOID;ことだろうがC(編集:その時から、MicrosoftのCコンパイラで、「定義された」のように)単にdoesnの」それを許可するので、代わりにマクロを使用します。

+0

いいえ、あなたはそれを持っています。必要なtypedefは 'typedef void VOID'です。これは完全に許可されています。それを試してみてください。 –

+3

私はtypedefを後方に入力しました。しかし、修正されたとしても、当時のマイクロソフトのコンパイラは許していません。マイクロソフトがCの定義として扱ったのは当然のことですが、ほとんどのコンパイラはそれを許していましたが、マイクロソフトはこれを許可しましたが、ものはしませんでした。 –

12

Windows APIは古いです。 本当に古い。古い公式のC標準より古い。

これは、Windows APIがさまざまなレベルの言語サポートを備えたあらゆる種類の古代Cコンパイラに対処しなければならないことを意味します。一部はvoidをサポートしていない可能性があります。一部の人は、intというタイプのウィンドウが、intと考えられているものと互換性がない場合があります。一部の人がshortを理解していない可能性があります。回避策として、Windows APIはその特定のコンパイラで動作するものにエイリアスされた大文字の移植可能な同等物を提供します。

もちろん、現代のコンパイラでは、物事はかなり落ち着いています。たとえば、誰でもvoidをサポートしています。ただし、これらの大文字マクロを使用する古いコードとの互換性を維持するためには、#definetypedefを残す必要があります。

+5

Raymond Chenには、Windowsの歴史に関する興味深いブログ記事がたくさんあります。彼は私が知っている限り、「VOID」について書いていませんが、彼はWin32のすべてのブール型について書いています:http://blogs.msdn.com/b/oldnewthing/archive/2004/12/ 22/329884.aspx、http://blogs.msdn.com/b/oldnewthing/archive/2011/03/28/10146459.aspx –

関連する問題