- ベストアンサー
コンパイルせずにマクロの置き換えだけ実行(c言語)
こんにちは。私はwin32APIを勉強しているc言語初心者なのですが、win32APIにはマクロで定義されたたくさんの新しい型があって、何がなんだか分からなくなります。なのでマクロの置き換えだけを実行してその新しい型がなんの型で出来ているのかを調べたいのですが、それをするにはどうすればいいでしょうか?使っているコンパイラはVC++2008です。回答よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
プリプロセスだけならcl.exe /Eですけど型は殆どtypedefですから置き換えだけしても見える物は変わりませんよ 一覧はMSDNにあるのでどうぞ
その他の回答 (4)
- titokani
- ベストアンサー率19% (341/1726)
>typedefだけ実行できたら便利だな、と思ったんです。 それは無理ですね。 私が型の定義が知りたい場合は、エディタの検索機能を使っています。 Win32での定義に限らず、他人の作ったソースを解読するのにも使える方法です。
お礼
無理なんですか。分かりました。回答ありがとうございました!
- titokani
- ベストアンサー率19% (341/1726)
一般に公開されているものとしては、こんなページがあります。 http://msdn.microsoft.com/ja-jp/library/aa383751(en-us,VS.85).aspx
お礼
Thank you!
- php504
- ベストアンサー率42% (926/2160)
Visual C++なら型名の上にマウスカーソルを移動するだけでその型の定義が表示されますよ。 また型名の部分で右クリックして定義に移動を選べばその型を定義しているファイルが自動的に開かれて該当の行にカーソルが移ります。 これを繰り返せば大元の型にたどりつけるはずです。
お礼
こんな事出来たんですか!説明をちゃんと読んでおけば良かった・・・。 回答ありがとうございました!
- BLK314
- ベストアンサー率55% (84/152)
その前に、なぜ、 "その新しい型がなんの型で出来ているのかを調べたい" のでしょうか? メモリを動的に確保するとかで、サイズが知りたいというならば、 元の型を知らなくてもsizeof で調査可能です。 では、そもそも、なぜたくさんtypedefされているのでしょうか? たとえば、ウィンドウハンドルなどのHANDLEも プログラムのインスタンスのHINSTANCEも 本質はvoid *です。 なら、全部HANDLEもHINSTANCEも使わずvoid*で済ませば よいのでは? でもこうすると、混乱が起きやすいのです。 ウィンドウ・ハンドルに間違ってhInstanceを代入したりしてしまう。 もちろん、コンパイラはどっちも同じ型(void*)と認識するので、 本質的には防げないのですが、 (STRICTでない場合、現在はデフォルトがSTRICTなのでチェックできる) でも、別の型にtypedefしておけば、 間違いを防ぎやすいというメリットがあります。 このようなメリットがあるので typedefの中身を知ろうとせずに、 素直に別の型として考えたほうがよいのです。 もちろん typedefの目的はそれだけではありません。 長い型名を短く省略したいとして導入される場合もあります。 unsigned long ==> ULONG などが典型です。 大体が想像のつくように省略されますが、 もし、ULONGが省略されすぎてわかりにくいというなら unsigned long と打っても全く問題ないと思います ULONGはunsigned longの省略以上の役割があるとは思えないからです、 要するに 基本的に、型の中身がなんであるかはブラックボックスでよい。 大きさを知りたければsizeofが使える ただし、C組み込み型の省略形 unsigned char ==> BYTE (UCHAR) unsigned int ==> UINT unsigned short ==> USHORT unsigned long ==> ULONG 等は知っておいてもよい。 (簡単に想像できると思いますが)
お礼
私がソースを書く分ならわざわざ新しい型を使うことは少ないのですが、他人のソースコードを解読する時にtypedef定義された型が出てくると「これは何の型なんだろう?」となってしまうのです。それに私はまだ初心者なので他人のソースを見ることが多いです。sizeofでサイズを調べたりもしますが、違う型でもサイズが同じだったりするので「これはポインタなのかintなのか配列なのかそれとも構造体か!?」と言うことがよくあります。マイナーな型だと検索しても情報が余りありませんしね。なのでtypedefだけ実行できたら便利だな、と思ったんです。アドバイスありがとうございました!
お礼
typedefマクロとは違うものだったんですか! 一覧参考にさせていただきます。少しずつエキサイト翻訳にかけて解読しているのですが、プログラミングをしていると何かと英語が必要になってくるので英語も本格的に勉強した方がいいかもしれません・・・。やっぱりプログラミングって難しいですね!