[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

Re: [MD:7289] w32api 3.7 でビルドエラー



藤井です。

From: MIYOSHI Masanori <miyoshi@xxxxxxxxxxx>
Subject: Re: [MD:7289] w32api 3.7 でビルドエラー
Date: Tue, 25 Apr 2006 21:38:37 +0900
> > - インクルードガードに用いるマクロを条件判定に使わない。
> 
> >   RECONVERTSTRING 構造体の定義判定に用いているマクロ _IMM_ は imm.h が
> >   インクルード済みかどうかを判定するマクロですが、Cygwin に含まれる
> >   imm.h では _IMM_H が定義されており、互換性がありません。
> 
> これはそうですね。使うべきではないですね。
> 
> 
> > - WINVER を条件判定に使わない。
> 
> >   Cygwin では WINVER は定義されていません。
> 
> windef.h で定義されているのでは?

そうですね。windows.h には定義されていないので、Cygwin では定義されてい
ないものだと勘違いしてました。

> >   WINVER は最新ではない OS でもビルドできるバイナリを作成するために、新
> >   しい定数定義や関数宣言などを抑制するためのマクロであって、SDK で目的
> >   の定数や関数が定義されているかどうかを判定するために使うべきではない
> >   と思います。
> 
> “WINVER を使うべきでない”が真であるとして、良い代案はあるでしょ
> うか?
> 
> 本来であれば、configure で、構造体や関数の有無をチェックすべきな
> んでしょうけど、ちょっと面倒ですよね。

configure より手軽な代案は今のところ思いついていません。

> > Index: src/mw32term.h
> > ===================================================================
> > --- src/mw32term.h	(revision 4060)
> > +++ src/mw32term.h	(working copy)
> > @@ -847,6 +847,19 @@
> >  #define IR_CLOSECONVERT   0x122
>  
> >  #ifdef IME_RECONVERSION
> > +#if (!defined (_IMM_) || (WINVER < 0x040A)) && !defined(IMR_RECONVERTSTRING)
> 
> IMR_RECONVERTSTRING が未定義の場合は、必ず RECONVERTSTRING も未定
> 義であることが成り立ちますかね?

成り立つとは言えません。r4061 の変更は一旦取り消して、
IMR_RECONVERTSTRING の有無を確認するのではなく、Cygwin では w32api のバー
ジョンを見て判定するように変更しました。(VC では r4060 以前のまま)

# 他の構造体でも同様な方法で判定している部分が多く見受けられるのですが、
# 何か確認方法が確立されているのでしょうか?確立されていれば教えていた
# だけると助かります。

> そうであれば、これは
> #indef IMR_RECONVERTSTRING
> で十分なのですけどね。

そうとも言えないようです。_IMM_ は RECONVERTSTRING 構造体が SDK で提供
されているかどうかの判定ではないので、他の部分も変更しないと外せないよ
うです。
# なので Cygwin では _IMM_H を条件判定に追加しています。

--
藤井 正行 / Masayuki FUJII