トップC++入門 > マクロ
マクロ

1.はじめに

GPSセンサーから位置情報を読み込もうとしているが、 C++にはずっと遠ざかっていたので、遅々として進まない。

ヘッダファイルに次のような記述があるが、良くわからない。

[guiddef.h]
#ifdef INITGUID
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
        EXTERN_C const GUID DECLSPEC_SELECTANY name \
                = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }
#else
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
    EXTERN_C const GUID FAR name
#endif // INITGUID
[sensors.h]
// {ED4CA589-327A-4FF9-A560-91DA4B48275E}
DEFINE_GUID(SENSOR_TYPE_LOCATION_GPS, 0XED4CA589, 0X327A, 0X4FF9, 0XA5, 0X60, 0X91, 0XDA, 0X4B, 0X48, 0X27, 0X5E);

文献[1]によれば、GUID構造体は 128ビットのGUID値を保持するためのものである、とある。

typedef struct _GUID {
    unsigned long  Data1;       // 最初の8桁の16進数を格納
    unsigned short Data2;       // 2番目の4桁の16進数を格納
    unsigned short Data3;       // 3番目の4桁の16進数を格納
    unsigned char  Data4[ 8 ];  // 4番目以降8つの2桁の16進数を格納する配列
} GUID;

このような構造体の初期化は

  GUID SENSOR_TYPE_LOCATION_GPS = { 0XED4CA589, 0X327A, 0X4FF9, { 0XA5, 0X60, 0X91, 0XDA, 0X4B, 0X48, 0X27, 0X5E } };
とする。上のマクロはこれに相当する働きを持つ。当初、C++特有の機能かと思ったが、これは C言語でも同じだ。

となれば、

#define INITGUID 1
といった行を前に置いておく必要がある。

これでひとつエラーが解決したが、次のような警告が出た。 あれこれインストールしているので、バージョンの違いがあるのかもしれない。

sapi01.obj : warning LNK4254: セクション 'ATL' (50000040) は '.rdata' (40000040)
 に異なる属性を伴ってマージされています

ググってみると、色んな人が経験しているようだ。 警告なので、気にはなるが、まだ、目的のプログラムではない。 いつまでも出るようなら、調べることにして、ひとまず、これで前進しよう。

A.リファレンス

[1] GUID