% Copyright 1994 NEC Corporation, Tokyo, Japan.
%
% Permission to use, copy, modify, distribute and sell this software
% and its documentation for any purpose is hereby granted without
% fee, provided that the above copyright notice appear in all copies
% and that both that copyright notice and this permission notice
% appear in supporting documentation, and that the name of NEC
% Corporation not be used in advertising or publicity pertaining to
% distribution of the software without specific, written prior
% permission.  NEC Corporation makes no representations about the
% suitability of this software for any purpose.  It is provided "as
% is" without express or implied warranty.
%
% NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
% INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN 
% NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
% CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 
% USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 
% OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 
% PERFORMANCE OF THIS SOFTWARE. 

\documentstyle[canna]{jarticle}
% $Id: wchar.tex,v 1.5 1994/01/27 11:09:59 kuma Exp $
\begin{document}

\begin{center}
{\Large
wchar\_t の定義とマクロ
}

1993.2.9

今~~~~~~~~~昭

kon@d1.bs2.mt.nec.co.jp
\end{center}

\begin{table}[htbp]

\caption{各マシンでの wchar\_t の定義とマクロ}
\label{wtable}

\vspace{5mm}

\footnotesize

\begin{tabular}{|l|c|l|p{2cm}|} \hline
\multicolumn{1}{|c|}{マシン} & マクロ & \multicolumn{1}{c|}{型} &
\multicolumn{1}{c|}{ヘッダファイル} \\ \hline \hline
AIX 3.2 & \_WCHAR\_T & unsigned short & ctype.h \\ \hline
ConvexOS Release V9.1.6 + CONVEX C V4.0 &  \_\_WCHAR\_T & char &
stddef.h stdlib.h \\ \hline
DEC Station Ultrix 4.2(A,B,C 含む) & \_WCHAR\_T\_ & & stddef.h
stdlib.h \\ \hline
EWS-UX/V (Rel4.0) R6.1 &  \_WCHAR\_T & unsigned long & stddef.h
stdlib.h widec.h curses.h \\ \hline
EWS-UX/V R9.1 & \_WCHAR\_T & unsigned short & stdio.h \\ \hline
FUJITSU UXP/M V10L10 (SVR4) & \_WCHAR\_T & & \\ \hline
FUJITSU SX/A E60B & なし & & \\ \hline
HPUX 8.05, 8.07 & \_WCHAR\_T & & \\ \hline
IRIX System V Release 3.3.1 & \_WCHAR\_T\_ & int & stddef.h stdlib.h \\ \hline
Kubota 3000, TitanOS UNIX Release 4.1 & なし & unsigned short &
jcode.h jctype.h jae/widec.h \\ \hline
MIPS RISC/os 4.2 & なし & char & stddef.h \\ \hline
NeXT Mach3.0 & なし & unsigned short & \\ \hline
NeXT NeXTSTEP 3.0J & & unsigned short int & \\ \hline
NEWS-OS 4.1R & \_WCHAR\_T & & \\ \hline
SunOS4.1.1 w/o JLE & なし & & \\ \hline
SunOS4.1.1 + gcc-2.3.2(fixincludes) & \_GCC\_WCHAR\_T & & \\ \hline
SunOS4.1.2 + JLE1.1.2 & \_WCHAR\_T & & \\ \hline
日本語Solaris2.0(SunOS5.0) & \_WCHAR\_T & & \\ \hline
日本語Solaris2.0 + gcc-2.3.2(fixincludes) & \_WCHAR\_T & & \\ \hline
OP-UX/V(Rel3.2) R2.0 & \_WCHAR\_T & int & stddef.h stdlib.h widec.h \\ \hline
PC-UX/V Rel3.2B & \_WCHAR\_T & int & stddef.h stdlib.h widec.h \\ \hline
\end{tabular}
\end{table}

\section{解説}

『かんな』では内部処理にて wchar\_t を用いている。またアプリケーション
インタフェースとして wchar\_t ベースのものも準備している。『かんな』を
インストールするプラットフォームが Release 3 以降の System V だったり、
ANSI-C がサポートされている環境であれば『かんな』の wchar\_t と OS の
wchar\_t の表現を合わせることができる。

一方 OS の wchar\_t 環境になんらかの不十分な点がある場合、OS 側の
wchar\_t 定義が行われないようにして、『かんな』内部で定義した wchar\_t
定義を使うこともできる。(これは『かんな』のトップディレクトリの
config.sh に wcharDefinition=-DCANNA\_WCHAR を定義することにより行われ
る。)

以上は次の２つの基本制御より行っている。

\begin{enumerate}

 \item OS 定義の wchar\_t を用いる。
 \label{use}

 \item OS 定義の wchar\_t が行われないようにする。
 \label{ignore}

\end{enumerate}

wchar\_t の定義は typedef で行われるため、定義を２回以上行うとコンパイ
ルエラーが発生する。このため通常は wchar\_t の定義とともに wchar\_t を
定義したことを示すマクロを定義し wchar\_t が２回以上行われないように工
夫を行っている。以下は wchar\_t 定義の典型的な例である。

\begin{quote}
 \begin{verbatim}

#ifdef _WCHAR_T
#define _WCHAR_T
typedef unsigned long wchar_t;
#endif /* _WCHAR_T */

 \end{verbatim}
\end{quote}

前に記した(\ref{use})を達成するには上記定義を行っているヘッダファイル
をインクルードすればよい。(\ref{ignore})のためには「インクルードしない」
だけではすまない。ヘッダファイルのネストの結果として思わず上記定義を含
むヘッダファイルもインクルードしてしまうことがあるためである。したがっ
て(\ref{ignore})のためにはとりあえず \_WCHAR\_T などのマクロを定義して
しまうのが一番良い。

さて、ここで依然問題として残るのは以下の点である。

\begin{itemize}

 \item 上記定義が行われているヘッダファイルが OS によりまちまちである。

 \item \_WCHAR\_T に当たるマクロ名が統一されていない。中には(JLE を含ま
ない SunOS など)\_WCHAR\_T に当たるマクロを定義しない OS もある。

\end{itemize}

この状況を示したのが最初に掲げた表である。

『かんな』では widedef.h にてこの違いを吸収しようとしている。
widedef.h は $<$sys/types.h$>$ などのヘッダよりも先にインクルードされなけ
ればならない。

\section{謝辞}

表\ref{wtable}のデータはネット上の有志の方々の協力によって作成された。
Canna@astec.co.jp メーリングリストを通して協力してくださった以下の方々
に感謝します。

九州工業大学の堀さん、上智大学の三木さん、福井大学の笹田さん、東京工業
大学の萩原さん、東京大学の古畑さん、富士通の峯野さん、SRA の石曽根さん、 
NEC 技術情報システム開発の井畑さん、SRA の鈴木さん、神戸日本電気ソフト
ウェアの舩橋さん。大変ありがとうございました。

\end{document}
