Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

typedefに぀いお確認させおください

50 views
Skip to first unread message

IIJIMA Hiromitsu

unread,
May 28, 2003, 8:20:27 PM5/28/03
to
いいじたです。

「typedefで定矩される型は、#if で挔算に甚いるこずはできない」
䞊蚘の呜題はあっおいるでしょうか。

たずえば、こんなコヌドです。
//---システムが甚意するヘッダファむル
typedef unsigned short wchar_t;

//---それを #include するコヌド
#if sizeof(wchar_t)==2
#define UCS2 wchar_t;
typedef uint_least32_t UCS4;
//埌略

これはプリプロセッサの段階で゚ラヌになるのが正しいんですよね。

そもそも char が 8 ビットずいうこずすら芏栌は保蚌しおいないので、
sizeof(short)==2 なんお無意味なんですが。

で、wchar_t に関しおは玠盎に WCHAR_MAX を芋お刀定するのが吉、ず。

========================================================================
飯嶋 浩光 / でるもんた・いいじた http://www.ht.sakura.ne.jp/~delmonta/
IIJIMA Hiromitsu, aka Delmonta mailto:delm...@ht.sakura.ne.jp

KATAYAMA Yoshio

unread,
May 29, 2003, 6:50:22 AM5/29/03
to
片山です。

In article <3ED5524B...@ht.sakura.ne.jp>,
IIJIMA Hiromitsu <delm...@ht.sakura.ne.jp> writes:

>「typedefで定矩される型は、#if で挔算に甚いるこずはできない」
>䞊蚘の呜題はあっおいるでしょうか。

typedef は typedef名を定矩するものであっお、型を定矩するのでは
ありたせんから、「typedef で定矩される型」なるものは存圚したせん。

「typedefで定矩される型」が「typedef で typedef名ずしお定矩され
る識別子」のこずず解釈するず、これは、この段階では単なる識別子ず
しお扱われたすので、#if の匏に甚いるこずができたす。

しかし、その倀は 0 ずなるでしょう

>たずえば、こんなコヌドです。
> //---システムが甚意するヘッダファむル
> typedef unsigned short wchar_t;

> //---それを #include するコヌド
> #if sizeof(wchar_t)==2

この #if の匏は、

0 ( 0 ) == 2

ず解釈され、構文゚ラヌになりたす。

>これはプリプロセッサの段階で゚ラヌになるのが正しいんですよね。

理由はずもかく、結論だけは合っおいたす。:-)
--
片山

IIJIMA Hiromitsu

unread,
May 29, 2003, 11:48:15 AM5/29/03
to
いいじたです。

> typedef は typedef名を定矩するものであっお、型を定矩するのでは
> ありたせんから、

なるほど、「typedef 名」ずいう、きちんずした蚀葉があるんですね。

> >たずえば、こんなコヌドです。
> > //---システムが甚意するヘッダファむル
> > typedef unsigned short wchar_t;
>
> > //---それを #include するコヌド
> > #if sizeof(wchar_t)==2
>
> この #if の匏は、
>
> 0 ( 0 ) == 2
>
> ず解釈され、構文゚ラヌになりたす。

うわあ 
「識別子 wchar_t は未定矩」ずいう臎呜的゚ラヌになるず思っおいたのですが、
そうではないのが芏栌ずしお正しいのですね。

そもそも #if の䞭では sizeof も䜿えないのか 

実際の凊理系では
・#if の䞭で sizeof が䜿えるように独自拡匵を斜しおいる
・未定矩の識別子を䜿ったら゚ラヌないし譊告を出す
ものがあるず思うので、䜙裕のあるずきに耇数の凊理系で確認しおみたす。

> >これはプリプロセッサの段階で゚ラヌになるのが正しいんですよね。
>
> 理由はずもかく、結論だけは合っおいたす。:-)

ありがずうございたす。やはりこの堎合は WCHAR_MAX を䜿うこずになりたすね。

歎史的にはのコヌドのコンパむルはプリプロセッサ、パヌサ、コヌドゞェネ
レヌタ、アセンブラ、リンカの段階で、typedef はパヌサの担圓だから、その
前のプリプロセッサが担圓する #if では扱えないはず、芏栌もそれを远認する
芏定をしおいるはず、ず予想しおいたした。

Shinji KONO

unread,
May 29, 2003, 10:06:57 PM5/29/03
to
河野真治 @ 琉球倧孊情報工孊です。

In article <3ED62BBF...@ht.sakura.ne.jp>, IIJIMA Hiromitsu <delm...@ht.sakura.ne.jp> writes


> そもそも #if の䞭では sizeof も䜿えないのか 

でも、#if じゃなくお、if で曞けば良いず思いたすけど。
なんか問題あるんですか?

> 実際の凊理系では
> ・#if の䞭で sizeof が䜿えるように独自拡匵を斜しおいる
> ・未定矩の識別子を䜿ったら゚ラヌないし譊告を出す

自分で曞いたものでは、macro の展開を1 pass で行うので、
sizeof は䜿えたす。#if では未定矩の識別子は0ず刀断する
のが䟿利だろうず想像したす。自分のでぱラヌにしおいるな。

> ものがあるず思うので、䜙裕のあるずきに耇数の凊理系で確認しおみたす。

っおわけで、そんなものは(僕のもの以倖)ないず思う。

---
Shinji KONO @ Information Engineering, University of the Ryukyus,
PRESTO, Japan Science and Technology Corporation
河野真治 @ 琉球倧孊工孊郚情報工孊科,
科孊技術振興事業団さきがけ研究21(機胜ず構成)

IIJIMA Hiromitsu

unread,
May 30, 2003, 12:47:44 AM5/30/03
to
いいじたです。

> でも、#if じゃなくお、if で曞けば良いず思いたすけど。
> なんか問題あるんですか?

あ、普通はそっか。きちんず最適化オプション぀ければ if(0) はコンパむラが
䞞ごず削陀しおくれたすものね。

ただ今回の堎合、自䜜のヘッダファむルで

#if WCHAR_MAX==0x7FFFUL || WCHAR_MAX==0xFFFFUL


#define UCS2 wchar_t;
typedef uint_least32_t UCS4;
//埌略

ず曞いお、たずえば
UCS2 *foo(UCS2[]);
ず関数を宣蚀しお、Win32 環境ではこの foo() の匕数に wchar_t の配
列を枡す、ずいうこずをしたいんですよ。OS の MultiByteToWideChar
は wchar_t の配列にデヌタを返すので。

で、wchar_t が UCS-2 の凊理系では foo() に wchar_t の配列を枡しお
も文句を蚀われず、か぀、wchar_t が UCS-4 の凊理系、具䜓的に蚀うず
glibc ずかでは foo() に wchar_t の配列を枡そうずするず゚ラヌない
し譊告になる、ずいう仕様にしたいんです。

ずするず、識別子 UCS2 は typedef ではなく #define で定矩する必芁
がある、ずいうわけです。

 汚い方法です、はい。

IIJIMA Hiromitsu

unread,
May 30, 2003, 1:07:48 AM5/30/03
to
> #define UCS2 wchar_t;

はうっ。ここのセミコロンは䜙蚈。

Shinji KONO

unread,
May 30, 2003, 1:04:20 AM5/30/03
to
河野真治 @ 琉球倧孊情報工孊です。

In article <3ED6E270...@ht.sakura.ne.jp>, IIJIMA Hiromitsu <delm...@ht.sakura.ne.jp> writes


> ただ今回の堎合、自䜜のヘッダファむルで
> #if WCHAR_MAX==0x7FFFUL || WCHAR_MAX==0xFFFFUL
> #define UCS2 wchar_t;
> typedef uint_least32_t UCS4;

っおこずなら、そのヘッダファむルを生成するようなconfigure script
曞く方が最近は普通かも知れないですね。で、config.h をinclude
するず。

KATAYAMA Yoshio

unread,
Jun 2, 2003, 9:49:49 AM6/2/03
to
片山です。

In article <3ED62BBF...@ht.sakura.ne.jp>,
IIJIMA Hiromitsu <delm...@ht.sakura.ne.jp> writes:

>> typedef は typedef名を定矩するものであっお、型を定矩するのでは
>> ありたせんから、

>なるほど、「typedef 名」ずいう、きちんずした蚀葉があるんですね。

ISO では「typedef name」ですが、JIS では䜕ず蚳しおいるかは分かり
たせん。「typedef名」は、私が勝手に぀けた蚳語です。(_ _;

>> > #if sizeof(wchar_t)==2


>>
>> 0 ( 0 ) == 2
>>
>> ず解釈され、構文゚ラヌになりたす。

>「識別子 wchar_t は未定矩」ずいう臎呜的゚ラヌになるず思っおいたのですが、
>そうではないのが芏栌ずしお正しいのですね。

>そもそも #if の䞭では sizeof も䜿えないのか 

はい。

>実際の凊理系では
>・#if の䞭で sizeof が䜿えるように独自拡匵を斜しおいる
>・未定矩の識別子を䜿ったら゚ラヌないし譊告を出す
>ものがあるず思うので、䜙裕のあるずきに耇数の凊理系で確認しおみたす。

芏栌に埓うず、

1. 物理的な゜ヌスファむルのマルチバむト文字を文字集合に倉換。
end-of-line indicator を改行文字に倉換。
trigraph sequence を察応する単䞀文字内郚衚珟ぞ倉換。

2. 「\  改行文字」を削陀しお論理的な゜ヌスファむルぞ倉換。

3. 前凊理トヌクンず空癜類に分解。

4. 前凊理呜什の実行、マクロ呌出しの展開、_Pragma の実行。
#include 前凊理呜什では、取り蟌たれたヘッダヌ゜ヌスファむル
に぀いお、14 を再垰的に適甚。

5. 文字定数ストリングリテラルの゜ヌス文字集合芁玠ず゚スケヌプ
シヌケンスを察応する実行文字集合芁玠ぞ倉換。

6. 隣接するリテラルトヌクンの連結。

7. 前凊理トヌクンをトヌクンに倉換し、䞀぀の transration unit ず
しお、構文意味解析を行ない、翻蚳する。

8. 倖郚オブゞェクト関数の参照を解決し、ラむブラリコンポヌネン
トをリンクし、䞀぀のプログラムむメヌゞにたずめる。

の 8 フェヌズに分かれなければなりたせん。

「#if の䞭で sizeof が䜿えるように独自拡匵」するず、芏栌合臎では
なくなりたす。

「未定矩の識別子を䜿ったら譊告を出す」のは芏栌合臎ですが、゚ラヌ
にするず芏栌合臎ではなくなりたす。

>歎史的にはのコヌドのコンパむルはプリプロセッサ、パヌサ、コヌドゞェネ
>レヌタ、アセンブラ、リンカの段階で、typedef はパヌサの担圓だから、その
>前のプリプロセッサが担圓する #if では扱えないはず、芏栌もそれを远認する
>芏定をしおいるはず、ず予想しおいたした。

これを勿䜓ぶっお^H^H^H^H^H厳栌に定矩したのだず思いたす。
--
片山

0 new messages