• ベストアンサー

HDCのマクロ定義

VC++を勉強しているのです。 HDCハンドルの定義を遡って確認したら、インクルードファイルWINDEF.HとWINNT.Hに次のような定義を見かけました。 DECLARE_HANDLE(HDC); #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name そのマクロ定義の解析と意味、良く分からないのです。何方が教えて頂けるでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8516/19360)
回答No.1

#define JOIN(a,b) a##b と定義して JOIN(0x,0123) と書くと 0x0123 と書いたのと同じになるのは判りますか? #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name と定義して DECLARE_HANDLE(HDC); と書くと struct HDC__ { int unused; }; typedef struct HDC__ *HDC; と書いたのと同じになります。

jorufii
質問者

お礼

ご丁寧に回答して頂き誠にありがとうございます。 とても参考になりました。

関連するQ&A

  • #defineでの型定義について

    typedefと同様に#defineでも型定義できると聞いて行いましたがコンパイルエラーが出てうまくいきませんでした。どうすればいいでしょうか? typedef unsigned int Unit //OK #deifine Unit unsigned int //NG

  • 相互に参照する構造体について

    Cプログラミングについての質問です。よろしくお願いします。 以下のヘッダファイル(defx.h, defy.h)および、mainファイルが正しくコンパイルされるということなのですが、自分の環境(WinXP下でのgcc(MinGW))ではエラーが出ます。 エラー内容は error: redefinition of typedef 'SY' error: previous declaration of 'SY' was here error: redefinition of typedef 'SY' error: previous declaration of 'SY' was here です。 <defx.h> #if !defined(__SX) #define __SX typedef struct __sy SY; typedef struct { int a; SY *b; } SX; #endif <defy.h> #if !defined(__SY) #define __SY #include "defx.h" typedef struct __sy { int c; SX d; } SY; #endif mainファイルについては #include "defx.h" #include "defy.h" int main(void) { SX s; SY t; } 以上ですが、 よろしくお願い致します。

  • #defineで定義されている変数を展開する方法について。

    ・#defineで定義されている「a」が展開された形でソースを生成したいのですが、なにか良い方法はないでしょうか? 【変換前プログラム】 #include <stdio.h> #define a tbl.nest.m1 /* メンバの名称変更 */ int main(int argc,char *argv[]) { /* テーブル定義 */ struct tbl_ { int k1; struct nest_ { int m1; }nest; }tbl; tbl.k1 = 0; a = 1; fprintf(stderr,"k1[%d] m1[%d]\n",tbl.k1,a); return(0); } 【変換後プログラム】 #include <stdio.h> //#define a tbl.nest.m1 /* メンバの名称変更 */ int main(int argc,char *argv[]) { /* テーブル定義 */ struct tbl_ { int k1; struct nest_ { int m1; }nest; }tbl; tbl.k1 = 0; // a = 1; tbl.nest.m1 = 1; // fprintf(stderr,"k1[%d] m1[%d]\n",tbl.k1,a); fprintf(stderr,"k1[%d] m1[%d]\n",tbl.k1,tbl.nest.m1); return(0); } ※プリプロセッサで(cl.exe /E *.c)試してはみたものの、いまいち理解できません。

  • HANDLEのエラー

    C言語で #include<stdio.h> #include<windows.h> #include<wtsapi32.h> #include <process.h> int main(){ /*ハンドルをオープンする*/ /*NetBIOS名は16文字以下*/ char name[16]="NetBIOSname"; char *p; p= name; printf("%p\n",name); HANDLE handle; HANDLE = WTSOpenServer(&p); printf("%p",handle); } でやると'HANDLE' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。とエラー がでてきます、どこがおかしいかわからないです C++で実行するとできました。 #include<stdio.h> #include<windows.h> #include<wtsapi32.h> #include <process.h> int main(){ /*ハンドルをオープンする*/ /*NetBIOS名は16文字以下*/ char name[16]="NetBIOSname"; char *p; p= name; printf("%p\n",name); HANDLE handle = WTSOpenServer((LPSTR)&p); printf("%p",handle); } どこが原因になってるのか教えてください。

  • C言語に関して

    #include <stdio.h> #define NMAX 5 typedef union mixeddata { char status; double data; }MIXD; typedef struct expdata { int flag; MIXD result; ←ここ }EXPD; main() : : : 上のソースの「ここ」と書いてある場所の、result のバイト数はいくつか? と聞かれたのですが、何バイトでしょうか?  回答宜しくお願いします。

  • c#のマクロ定義について

    C言語でマクロ定義の場合以下のようにヘッダファイルに#defineで定義しますが、C#の場合どのようにすればいいのでしょうか。 C言語の場合 *** test.h *** #define TEST 5 C#の場合 public const int TEST = 5; //これでいいの? 専用のclassを用意するの? 初歩的な質問ですが宜しくお願い致します。

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • 構造体についてです。

    typedef struct student{ int id; char name[20]; int kokugo; int sansu; int eigo; }STUDENT; と、 struct student{ int id; char name[20]; int kokugo; int sansu; int eigo; }; の違いはなんでしょう? 私は下記をよく使うのですが・・・。 typedefについて詳しく知りたいです。

  • 勉強しています。力をかしてください。

    #include <stdio.h> #include <string.h> #define MAX_NUMBER 999 /* 最大登録件数 */ #define NAME 20 /* 氏名の文字数 */ #define DATE 9 /* 生年月日の桁数 */ #define ID 4 /* IDの桁数 */ #define INT 8 /* 登録・修正日の桁数 */ typedef struct { /* 社員名簿 */ char ID[NUM]; /* 社員番号 */ char name[NAME]; /* 氏名 */ char birth[DATE]; /* 生年月日 */ int touroku; /* 登録日 */ }syain_data; このような構造体で、 001 abc 20000101 20070911 と、画面表示し、S_data.txtファイルに書き込むようにしようとおもうのですが、以下のところで悩んでます。教えてください。 /* 実行時の日付の表示 */ void put_data(void) { FILE *fp; time_t t; struct tm *local; time(&t); local = localtime(&t); fprintf(fp, "%2d%2d%2d%2d\n", local->tm_year + 1900, local->tm_mon + 1, local->tm_mday); 20070911←の表示のことですが、これをファイルに書き、構造体に書くにはどうすればいいのでしょうか?

  • VC++2005で言語拡張切ってみたら大量のエラー

    VC++2005にて、言語拡張を切る(/Za)と、以下のようなエラーが36個ほど出ます。 ~略~\platformsdk\include\winnt.h(477) : error C2467: 無名の 'struct' の宣言が誤っています。 ~略~\platformsdk\include\winnt.h(495) : error C2467: 無名の 'struct' の宣言が誤っています。 そして、コンパイルできなくなります… なんというか、これはマイクロソフトの陰謀ということでいいのでしょうか? 報告例) http://agpg.seesaa.net/article/12818703.html

専門家に質問してみよう