djgcci* 解講座・ llello 刪 されたファイルに対する cat コマンドとして compress を使うことがて、きます。 compress の問題点 compress コマンドて、は , 圧縮後のファイ ルを , もとのファイルの名前のあとに . Z と いうサフィックスをつけた名前のファイル に格納します。そのため , MS-DOS て.com press を使う場合 , ファイル名をどう置き換 えるかが問題になります。 MS-DOS て、は , 拡張子がひとっしか使えず , 長さも 3 文字に 制限されているのて、 , ファイル名の後に . Z をつけられないことがしばしばあります。 djgcc の compress は , . Z て、なく Z をファイ Fig. 2 compress の問題点 dO you wish tO overwrite makefiIeZ (y 0 「 n) ? dO you wish tO overwrite 「 ensai 11. txtz (y 0 「 n) ? makefiIeZ already exists , rensai 1 1 txtZ already exists , compress の差分ファイル compress. dif List 1 : Sun Jul 21 15 : 16 : 42 1991 * * * compress. org 2 : compress. c Sun Aug 18 13 : 41 : 12 1991 3 : 4 : * * * 457 , 463 * * * * / * DO not overwrite unless 5 : int overwrite = 0 : -f fl * / glven char tempnameC100] : 6 : char **filelist, **fileptr; 0 したがって , 次のふたつの式は等価てある。 よる不都合は生じない (int)a 十 = 5 5.6 長さゼロの配列 (int) ()= (char * ) ((int)a + 5)) GNU C て、は長さゼロの配列が許される。長さゼロ 5.5 中間項を省略した条件式 の配列は可変長オプジェクトのヘッダとなる構造体 条件式の中間項は省略することがて、きる。この場 の最後の要素に便利て、ある (List B)O 合 , 第一項が非 0 て、あれば , その値が条件式の値とな 標準 C て、は , contents に長さ 1 を与えなければなら る。つまり , 次の式 , ない。メモリをムダにするかまたは malloc の引数の 計算が複雑になってしまう。 は x が非 0 の場合にはその値となり , 0 て、ある場合には 5.7 可変長配列 y の値となる。 この例は次の式と完全に等価て、ある。 GNU C て、は可変長の auto 記憶域配列が許される。 可変長配列は通常の auto 配列と同様に宣言される この単純な例て、は中間項を省略て、きるメリットは が , 長さ指定が定数式て、はない。配列変数の領域は その時点て、割り付けられ , プロックから出た時点て、 とくにない。この機能が有用てあるのは第一項が副 作用を含む ( あるいはマクロ引数のように含む可能性 解放される (List C) 。 がある ) 場合て、ある。その場合には中間項を繰り返す 可変長配列を関数引数とすることもて、きる。 と副作用が二度実行される。中間項を省略した場合 struct entry tester (int len, char data [len] ) にはすて、に計算された値を使用するため , 再計算に 長さ 0 の配列 List B 1 : struct line { int length; 2 : 3 : char contents [ 0 ] : 5 : 7 : 8 : 9 : 10 : } struct line *thisline (struct line * ) 皿 110C (sizeof (struct line) + this—length); thisline->length ニ this—length; djgcc 詳解講座・ He110 GCC World 79
特集いと G Fig. 1 ー v オプションをつけたコンノヾイル結果 果 0 戸 0 , , 行 実 A> gcc —V gomi. cc - 1 gcc version 1.39 a : /djgcc/b in/cpp. exe ー + -v -undef -D—GNUC— -DGNUDOS -D—GNUG -Dunix ー Di386 -D_unix— - D ー j386 ーー gomi. cc b:/ccAA AAA. cpp GNU CPP version 1 、 39 a:/djgcc/bin/cclplus. exe b:/ccAA AAA. cpp -quiet -dumpbase gomi. cc -version ー 0 b : /ccAA_AAA. s GNU C + + version 1.39.0 beta (based on GCC 1.39 ) ( 80386 , BSD syntax) compiled by GNU C version 1.39. defau れ target sw i tches : ー m80387 a: /djgcc/b i n/as. exe -0 gom i. 0 b : /ccAA_AAA. s a:/djgcc/bin/ld. exe b:/djgcc/Iib/crtO. 0 gomi. 0 -ic -lm A 〉 -D ℃ pl usplus INS REP され , gomi という g032 の実行ファイルが生 わせて参照してほしい また , 残念なこと たとえば , C て、書かれた関数の宣言を , 成される。コンパイル過程を詳しく表示す に GNU C 十十のマニュアルは最新の GNU int hash(char*) ・ るために -v オプションをつけてコンパイル C の仕様を反映していない ' こに掲載する とする。 C て、は , 関数名の多重定義がないの すると Fig. 1 のように表示される。 マニュアルて、は , GNU C のバージョンアッ て、 , C コンパイラは , hash という識別子をリ プに従って仕様が変更された部分のうち , ンカに対して生成する。 実行 わかる範囲て、更新してある。 こて、 , C 十十において , 生成された gomi は , a. out フォーマットを extern int hash(char*) ・ GNU C 十十コマンドオプション 持つ g032 の実行ファイルなのて、 , そのまま hash ( ” test ” ) ・ int X て、は MS ー DOS 上て、実行て、きない。ゆえに go として C の関数 hash を呼びたいとしよう。 32 を使って , コマンドオプションは gcc のものに非常に しかし C 十十て、は , 関数名の多重定義によ 似ているが , 若干の違いがあるのて、 , そのあ g032 gomi り int hash (char * ) ; と int hash (int) : は , のように , DOS 工クステンダの引数として たりを掲載した。 GNUC 十十て、追加された 異なる関数実装を指してよい。そして , 実行するプログラムを指定する ( 引数を続け オプションは , ・ -WimpIicit' , ・ -Wreturn れらの関数実装を区別するため , 前者には て指定て、きる ) 。また , stub. exe を使って , hasi FPc, 後者には hasi Fi という , 引数 -type' -fdefault-inline' -fstrict-pro 自動的に g 。 32 を起動することもて、きる ( 詳し の数と型を考慮した符号化識別子を使う。 -felide-constructors' -fall-v totype' , くは ' 91 年 10 月号特集参照 ) 。実行例を Fig. 2 それゆえ , この例て、は C 十十コンパイラは h irtual' -fthis-is-variable' ¯fsave¯m に示す。 -fmemoize-lookups' て、ある。 asi FPc という関数をリンクしようとして emoized' あとは , GNU C と意味が少し違ったり , 修 失敗してしまう。これをうまく処理するた 正されているものて、ある。オプション・ -p' , extern ” C ” int hash (char * ) ・ を -a' は , まだ実装されていない。ま と宣言しなければならない た djgpp に関して必要と思われるところには 、、 User' s Guide to GNU C 十十クは , GN かって C 十十 ReI. 1.0 て、は , 多重定義す 訳注をつけておいた。 U C のマニュアル、、 Using and Porting GN る関数名だけを , U CC" に手を加わえて作成されている。 GN overload hash U C のマニュアル、、 Using and Porting GN と宣言していたが , これは分割コンパイル U CC" は , 本誌連載記事「 djgcc 詳解講座」に マニュアルて、も述べられているが , C 十十 やライプラリ作成において問題を生じさせ おいて日本語訳が掲載されているのて、 , て℃や FORTRAN て、書かれた関数や手続き ていた。 C 十十 Rel. 2.0 ては , すべての関 こては , GNUC とは異なる部分を中心に掲 をリンクする際は , 工夫が必要て、ある ( これ 数名が多重定義されるとして , ほかの言語 載する。「 djgcc 詳解講座」のマニュアルもあ は type-safe linking と呼ばれる )。 のコードとリンクするものだけを指定する 特集 C 十十と DJGPP 43 User' s Guide tO GNU C 十十 ( 日本語版 ) GNU C 十十の ヘッダファイルとライプラリ
djgcc 詳解講座 第 3 回 djgcc のライフラリ関数② 安田英之膕プロド ~ 前回に引き続いて , dJgcc のライプラリ関数の解説です。今回は , lib s 「 c / c / gen の一般ライプラリです。また gcc.texinfo の訳は , 「 G NIJ による C 言語への拡張 (GNIJ Extensions tO the C Lan guage) 」に入ります。 GCC 独自の機能の解説なので活用してください。 詳細は省略しますが , 日本標準時を使う場 合は , time t 型の時刻 timep を , 対応するグリニ ッジ標準時 ( GMT ) の tm 型に変換します。 SET TZ=JST ー 9 と設定して tzset ( ) を呼び出せば大丈夫て、 setjmper. よび timezone. c て、定義されて struct tm * localtime (const time t * tim す。 いる関数は , アプリケーションから直接使 デフォルトて、は , 米東部標準時 ( EST ) が time t 型の時刻 timep を , 対応するローカ うことを想定していないのて、 , 説明を省き ル時刻の tm 型に変換します。 使われます。 ます。 どのような標準時を使うかは , あらかじ sleep. c time. C め tzset( ) て、設定しておきます。 time t mktime(const struct tm * tmp) ・ void sleep (unsigned int seconds) ・ 型 time t は , 時刻を 1970 年 1 月 1 日からの秒 seconds 秒間ウェイトします。時間は秒単 tm 型の時刻 tmp を , 対応する time t 型の 数て、表す型て、 , djgcc て、は unsigned long と 位て、測っているのて、 , 最大 1 秒の誤差が生じ 時刻に変換します。 gmtime() の逆て、す。 して実現されています。 ます。 char * asctime (const struct tm * timept time t time(time t (t) ・ 現在の時刻を time t 型て、返します。また , usleep. c tm 型の時刻 timeptr を , ASCII 文字列て、表 t が NULL て、なければ , *t にも現在の時刻を void usleep (unsigned int useconds) ・ した時刻に変換します ( Fig. 1 ) 。 格納します。 useconds マイクロセカンド間ウェイトす char * ctime (const time t * timep) ・ difftime. c るはずて、すが , 内部て、は単に useconds を秒 time t 型の時刻 timep を , ASCII 文字列て、 に換算して sleep ( ) を呼び出しているだけな 表した時刻に変換します。形式は asctime double difftime(time t timel, time t tim のて、 , やはり最大 1 秒の誤差が生じてしまい ( ) と同じて、す ( 内部て、 asctime ( ) を呼び出し ます。 time t 型のふたつの時刻の差を double の ています ) 。 秒数て、返します。 void tzset (void) ; fnmatch. c 環境変数 TZ に従って , どのようなローカ ctime. C char * Stri int fnmatch (char * pattern, ル時刻を使うかを設定します。設寓方法の tm は , 時刻を年・月・日・時・分・秒な Fig. 1 tm 型の時刻 timeptr の形式 ( 曜日・月・日・時・分・秒・年 ) どのエントリの組て、表す構造体型て、す。 ctime. c のルーチンは , 時刻をこの tm や A %. 3s %. 3s % 3d % 02.2d : % 02.2d : % 02.2d %d*n SCII 文字列を使って扱います。 struct tm * gmtime(const time t * time dJgcc 通信 74 C MAGAZINE 1992 1
MAGAZINE 1992 年 1 月 1 日発行 ( 毎月 1 回 1 日発行 ) 第 4 巻第 1 号通巻 28 号 1990 年 2 月 2 日第 3 種郵便物認可 提携・ LA ト 4 ー E 誌 / 監修・石田晴久 C 言語技術情報誌・ C マカシン 1 一 ・本誌掲載ソースプログラム ・ ANSI C 言語入門講座活用集 ・ XGCC9 ・ Pasca ロンヾイラ『カペソン ・ GNU C 十十コンヾイラ『 DJGPP 5 ' '2HD 特別付録 新連載実践アよレゴリズム戦略〈第 1 回〉刊レゴリスムの設計法 djgcc 詳解講座・ djgcc ライプラリ関数 ( 2 ) / C 言語雑学講座・構造体と共用体 / 明解 ANSI C 言語入門講座・列挙と整数と浮動小数点と 速報 >OuickC fo 「 WINDOWS>UNIX System V Release 4.0 Ver. 3.0 / 巻頭インタビュー >Motif アーキテクトクループ I 特集 >C 十十と DJGPP ・ GNU で体験する C 十十プロクラミングー提携記事 >How FarIs BerIin? >DitherIt!
ていない tlnteger' 整数を扱うクラス。ただし , のように , 値があふれることはない を Rational' int や long AT&T C 十十の complex クラスと同機 ・ Complex' として割り切れない数値も扱える。 有利数を扱うクラス。 1 / 3 などの , 小数 42 C MAGAZINE 1992 1 こて、あげたほかにも , libg 十十には , Cu りに使える。 文字列を扱うクラス。 C の char * の代わ ・ String' 能 ( 名前が違うことに注音 ) ・一ン、 0 とともに , そのクラスライプラリとして配 布されている。この libg 十十を djgpp 環境に 移植したものが libc. a に収められている。た だ , すべてのクラスが移植されているわけ て、はなく , いくつかの疑似汎化クラスは移 植されていない オリジナルて、は ,genclass というシェルス クリプトを使って List や Vector などの汎化 クラスを実現していたが , djgpp 版て、はまだ 用意されていない 以下に , libg 十十に含まれる代表的なクラ スの一部をあげよう。 を Stream' AT&T C 十十 Rel. 1 . 0 の stream ライ プラリの GNU 版。実装方法は AT & T と 異なり , 完全な互換性はない。 AT&T C 十十 Rel. 2.0 の iostream 相当のもの も配布されているが , djgpp には含まれ C 十十版 FILE 構造体 ( C の標準入出力 ) 。 C のそれとほば同様の機能を備える ( Pa rt3 参照 ) 。 cout くく” cout くく” くく” a ー b = 10 : } インストールとコンバイル C 十十プログラムをコンパイルするための説 pp て℃十十が使えるようにインストールし , ついては Part3 て、行うが , ます簡単に , djg djgpp を使ってのプログラミングの実際に たい ) 。 ログラミング入門」に詳しいのて、 , 参照され ibg 十十については本誌 ' 90 年 7 月号「 C 十十プ a, Obstack などのクラスが含まれている ( 1 rsesWindow, Fix, Bits, Randam, Dat を インストール 明をする。 インストール作業は , どの配布パッケー ジを用意するかて異なるが , ここて、は本誌 付録ディスクて、配付したものを例にして説 明する。 ' 91 年 10 月号付録ディスクと ' 92 年 1 月号付 録ディスクが必要て、ある。まず , ' 91 年 10 月 号付録ディスク No. 2 の README ファイル に記載されている方法に従って djgpp をイン ストールしてほしい ( 環境変数も設定する ) 。 こて、は , a : \ djgcc の下に 10 月号の配付フ ァイルがインストールされていることにす あとは ,a : YdjgccYbin に C 十十コンパイ ラ cclplus. exe を置くだけて、ある。 cclplus. e xe の圧縮ファイルが ' 92 年 1 月号付録ディス クに YdjgppYdjgpp. exe という名前て、収録さ 4 goml.cc 1 : #include く Complex. h 〉 Complex a(l, 3 : int main() { れている。 B : ドライプに付録ディスクをセ a : ットし , ないが , 先の環境て、インストールするとす る。これはコンパイラを使う際に必要て、は c. exe という圧縮ファイルに収められてい また , ライプラリソースは YdjgppYlibsr な環境変数も設定する必要はない する必要はない。 GNU C 十十のために新た とくにアーカイバなどのプログラムを用意 録ファイルは , 自己解凍ファイルなのて、 , の環境にあわせること ) 。付録ディスクの収 として展開すればよい ( ドライプ番号は自分 b : *djgpp*djgpp@) cd a . *djgcc*bin@ コンバイル とすればよい b : *djgpp*libsrc@ cd a : *djgcc*libsrc@ mkdir a . *djgcc*libsrc@ a : れば , i. cc は C 十十のプログラムとしてコンノヾイル 入力ファイルの拡張子が . cc だから , gom gcc ー 0 ー 0 gomi gomi. cc ド行は , 次のとおり。 として gomi. cc(List 4 ) を用意した。コマン ど同じて、ある。コンパイルするプログラム てみよう。コンパイルは , C の場合とほとん 動作確認のために , 実際にコンパイルし 4 : 5 : 6 : 7 : 8 : cout cout の , b(), 0.5 ) ; ”くく a くく” #n くく” b ニ”くく b くく” \ n ” a + b ニ”くく a + b くく” \ n ” a くく a ー b くく” \ n ”・
d 血 c 嚇解講座・ llello 刪面 arg_state を状態配列として指定します。 char *valloc(int i) ・ イバを使って , 複数のファイルをいったん 複数の独立な乱数列を使いたい場合は , i バイトの領域を , 仮想記憶のページのち ひとつのファイルにまとめた上て、 , それを 複数の状態配列を initstate( ) て、それぞれ初 ようど先頭からはじまるようなアドレスて、 compress を使って圧縮するのが普通て、す。 期化しておき , setstate ( ) て切り換えること 割り当てて返します。 圧縮には Lempel-Ziv 法を用いているの がて、きます。 なお , djgcc のページサイズは 4096 バイト て、 , 速度が高く , 圧縮率も悪くありません 呼び出し前に使われていた状態配列のア て、す。 ( LHA ほどて、はありませんが ) 。 ドレスを返します。 ただし , 圧縮の際のビット数の上限をデ アップデート情報 フォルトの 16 ビットにすると , 大量のメモ remove. C リを消費するのて、 , MS ー DOS 上て、は従来は int remove(char * f) ・ djgcc の patch4 て、配布ファイルに加えられ compress を実用的に使うことはて、きません パス名 f のファイルを消去します。成功し た compress は , UNIX て、は標準的なファイ て、した ( ビット数を落とすと圧縮率が下がっ たら 0 , 失敗したら一 1 を返します。 ル圧縮ツールとして使われています。フリ てしまいます ) 。 ーソフトウェアを圧縮して配布する場合も , djgcc の compress は g032 上て、動くため , valloc. c tar または shar などの圧縮機能のないアーカ のメモリの制約にとらわれずに , UNIX と同 ( ここて、は int とする ) , このマクロを List A ー②のよう より信頼性の高い方法となるて、あろう。 * 2 typeof とは別に , 式の 型を参照する方法として , に安全に定義することがて、きる。 builtin classify type( ) 5.3 typeof による型の参照 という , コンパイラ組み込 この埋め込み文は定数式中ては使用て、きない。列 み関数を使う方法もありま 挙型定数の値 , ビットフィールドの幅 , 静的変数の 式の型を参照するための方法として , typeof を使う す。この関数は , 引数の型 の種類に応じて値を返す , 初期値などは定数式て、ある。 方法もある ( * 2 ) 。 typeof を使うための構文は sizeof と というものて、す。この評価 はコンパイル時に行われま オペランドの型がわからない場合て、も同じことが 同じて、あるが , 働きは typedef 定義された型名と同じ す。 可能てあるが , この場合には typeof または型の命名を 具体的には , この関数は て、ある。 次のような値を返します。 使用する必要がある。 typeof の引数を記述するには式を与える方法および void 型 : 0 整数型 : 1 型を与える方法のふたつがある。式を使用した例を 5.2 式の型の命名 文字型 : 2 列挙型 : 3 示す。 フ・一一ノレ雪 ! ・ 4 typedef 宣言に初期化子を記述することによって , typeof (x[0] ( 1 ) ) ポインタ型 : 5 6 この例て、は x が関数型への配列型て、あると仮定して 式の型に名前をつけることが可能て、ある。力の型に オフセット型 : 7 〃の召という名前をつけるには次のようにすればよ いる。この記述によって表現される型はその関数の 実数型 : 8 複素数型 ; 9 返り値の型て、ある。 関数型 : 10 メソッド型 : 型を引数に与えた場合の例を示す。 typedef 4 襯召 = 召工カ ; 構造体 ( レコード ) 型 : 12 この機能は式の中て、の文とともに使用すると便利 共用体型 : 13 typeof (int * ) 配列型 : 14 て、ある。安全な最大値マクロを次のように記述して , この記述によって表現される型は int 型へのポイン 文字列型 : 15 16 すべての算術型に対応て、きるようにすることが可能 タて、ある。 ファイル型 : 17 もし ANSI C プログラムからインクルードされた場 他の言語依存の型 : てある。 18 この中には , C や C 十十以 合にも動作しなければならないへッダファイルを書 #define max(), b) \ 外の言語用に予約されてい るものも含まれています。 ({typedef ta= (a) , typeof_ を使 いているならば , typeof の代わりに これらの値は列挙型とし 用しなければならない。 typeof 形式は , typedef 名が tb b=(b) ; て typeclass. h< 定義されて ta a = (a ) ; いるのて , このヘッダをイ 使用て、きる場合ならどこて、て、も使用することがて、き ンクルードすれば , 具体的 な数値て、なく void type_cl 局所変数名をアンダースコアて、始めているのは , る。たとえば , 宣日 , キャスト , あるいは sizeof や t ass ( = 0 ) のようなシンポ ype 。 f の引数の中て使用することがてきる。 リックな表現も使えます。 a や b と置換される式の中に出現する変数名との衝突 たとえば , を防ぐためて、ある。将来新しい構文を導入して , 初 ・次の例て、は y を x の指す型と宣言する。 #include <stdio. h> 期化後にスコープが始まるような変数を宣言てきる typeof ( * x) y : main ( ) ようにしたいと考えている。このような衝突を防ぐ ・次の例て、は y を x の指す型の配列と宣言する。 djgcc 詳解講座・ He110 GCC World 77
List 2 75 : * * * 657 , 666 * * * * continue; *fileptr); fprintf(stderr, ” Xs : already has Z suffix ーー no change*n ” 73 : 74 : 77 : 79 : 80 : 82 : 83 : 84 : 85 : 86 : 88 : 89 : ・ 90 : ー 677 , 691 ー #ifndef BSD4_2 / * Short fi lenames * / if ((cp=rindex(ofname, ' / ' ) ) ! = NULL) cp = ofname; else / * 8 + 3 type filenames * / + #ifdef GNUDOS if ((cp=index(cp, strcat(ofname, ” . ” ) ; else + #else if (strlen(cp) 〉 12 ) { cp 十十 : 十 fprintf(stderr, ” Xs: filename t00 long tO tack on con t i nue ; + #endif / * GNUDOS * / #endif / * BSD4_2 strcat(ofname, Long fi lenames al lowed * / djgcc 詳解講座・ llcllo 刪 この連載のページにかぎって , GNU Gene 実行するには g032. exe が必要て、す。 ださい。当然ながら , この compress. exe を を実行して compress. c にパッチを当ててく patch <compress. dif まてす。再コンパイルする場合には , あら すが , ソース compress. c はオリジナルのま 実行形式 compress. exe は変更後のものて、 ファイルに含まれていたものて、す。 ます。 ral Public Licen に基づいた再配布を認め 関数を inline と宣言することにより , その関数のコ ードを呼び出し側に展開するよう GNUC に指示する ことがて、きる。インライン展開て、は関数呼び出しの オーバヘッドがないため高速て、ある。また , ある実 引数が定数て、あった場合 , コンパイル時の最適化に よってインライン関数のコードの一部を省くことが て、きる場合もある。 関数をインライン宣言するには , 予約語 inline を使 って次のように宣言すればよい ( もし ANSI C プログ ラムからインクルードされた場合にも動作しなけれ ばならないへッダファイルを書いているならば , inl inline を使用しなければならない ) 。 ine の代わりに inc (int *a) inline int しない。関数呼び出しはさまざまな理由により展開 いかぎりこのような関数のアセンプラコードを出力 GNU C て、は・ -fkeep-inline-functions' を指定されな その関数のアセンプラコードは参照されなくなる。 さらに関数のアドレスも使用されなかった場合には その関数の呼び出しすべてがインライン展開され , ある関数が inline かっ static と宣言されていると , イン展開に向かなくなる。 し , 関数定義の書き方によってはその関数はインラ 簡単な関数をインラインとすることもて、きる。ただ -finline-functions' オプションによってすべての されない場合がある ( たとえば , 関数定義以前の呼び 出しや関数定義中の再帰呼び出しなど ) 。これらの展 開されない呼び出しがある場合には関数のアセンプ ラコードは通常どおり出力される。関数のアドレス が使用された場合にも , それらを経由した呼び出し は展開て、きないため , アセンプラコードは出力され インライン関数が static て、ない場合 , ほかのソース ファイルからの呼び出しがあると考えなければなら ない。大域シンポルはプログラム中ただ 1 か所て、しか 定義て、きないため , その関数はほかのソースファイ ルて、定義されているはずはなく , そのファイル中て、 の呼び出しは展開て、きない。したがって , static て、な いインライン関数は常に , 通常どおりコンパイルさ れたコドを持つ。 関数定義に対して inline と extern の両方を指定する と , その定義はインライン展開にのみ使用される。 いかなる場合て、もその関数自体のアセンプラコード は出力されない。関数のアドレスが明示的に使用さ れた場合 , それは外部参照となる。関数宣言されて いても定義されていない場合と同様て、ある。 inline と extern の組み合わせはマクロとほとんど同 様の効果がある。ヘッダファイル上に関数定義を inl ine と extern を使って書き , 同じものをライプラリフ アイル上に in ⅱ ne と extern なして、書くとよい。ヘッダ ファイル上の定義によりほとんどの呼び出しは展開 される。展開されなかった呼び出しはライプラリ中 にひとつだけ存在するコードを参照する。 djgcc 詳解講座・ HellO GCC World 83
djgcc 詳解講座・ llo 刪闡面 ng, int flags) ・ string て、指定された文字列が , pattern て、 指定されたパターンにマッチするかどうか を調べます。 pattern には , 通常の文字のほか , 次のよ うな特殊記号が使えます。 て指定します。文字のあとに・ フ 任意の 1 文字とマッチする。 任意の文字列とマッチする。 カッコ内の文字のどれかとマッ チする。・ a ー z ' のように範囲を指 定することもて、きる。 [ ! ・・ ] と指 定すると , 逆にカッコ内に含ま れていない文字にマッチする。 と , そのオプションには引数があるものと みなされ , 見つかった引数はグローバル変 数叩 targ に代入されます。 たとえば , ・一 0 file' および・ -v' というオ プションが許されている場合は , List 1 の ようにします。 lnsque. C insque() および remque() て、扱う双 方向リストは , 次の形のデータ構造になっ また , 次の定数 ( unistd. h て、定義されてい ます ) のうちいくつかを・ドて、ならべて flag s に指定することによって , パターンの解釈 を制御て、きます。 FNM PATHNAME ・ / ' はワイルドカードとマッチしない FNM QUOTE ・ \ ' 十文字というパターンをその文字そ のものと同じて、あるとみなす。 getopt. c int getopt(int nargc, char * *nargv, char * ostr) ・ ostr て、指定された形式のオプションが , n argv に格納された nargc 個のコマンドライン 引数の中に指定されているかどうかを調べ , もし見つかったら , オプションの文字を 1 文 字返します。 get 叩 t ( ) は引数をどこまて、調 べたかを記憶しているのて、 , 次に呼ばれた ときには , 前回以降の引数を調べます。そ れ以上オプションが見つからなければ , ー 1 を返します。 ostr には , 許されるオプション文字を並べ ' をつける ている必要があります。 struct vaxque { struct vaxque * vq struct vaxque * vq vq_next, vq_prev は , next ・ prev , それぞれ次および 前の要素へのポインタて、す。 VOid insque (struct vaxque * e, xque * prev) ・ 双方向リストの要素 prev の次に要素 e を挿 入します。 「 emque. C struct va のマクロと同じ働きをします。通常は , マ それぞれ , ctype. h て、定義されている同名 toupper(int c) ・ isxdigit(int c), tolower(int c), isspace(int c), isupper(int c), isprint(int c), ispunct(int c), isgraph (int c) , islower(int c) , iscntrl(int c), isdigit(int c), int isalnum(int c), isalpha(int c) ・ , isctype. c 双方向リストから要素 e を削除します。 VOid remque(struct vaxque * e) ・ List getopt. c の使用例 1 : while ()c = getopt(argc, 3 : 4 : switch (c) { case ' 0 ' : Ofile case 'v' : vflag ー 1 ; break; optarg; break; クロの方が使われるのて、不要て、す。 mktemp. c char *mktemp(char *path) ; 一時ファイル用に , path およびプロセス ID をもとに , 存在するファイルと衝突しな い , 一時的なファイル名を生成します。 path には , 一時ファイルを置くディレク トリ名に続いて , プロセス ID て、置き換える 箇所を連続した・ X ' の列て、表したファイル名 を入れておきます。 ファイル名の生成に成功したら path, 失 敗したら NULL を返します。 int mkstemp(char *path) ; mktemp と同様に生成したファイル名て、フ ァイルを作成し , 成功したらそのファイル ディスクリプタ , 失敗したら一 1 を返しま す。 tmpnam. C char *tmpnam(char (s) ・ ディレクトリ s の下の , 一時ファイルのパ ス名を生成します。内部て、 mktemp() を読 んて、いるのて、 , パス名の衝突は起こりませ ん。 char * tempnam (char * dir,char * pfx) ・ tmpnam ( ) と似ていますが , ・環境変数 TMPDIR ・ dir " /usr/tmp ' ' /tmp この優先順位て、ディレクトリ名として使 われます。また , pfx が NULL て、なければ , ディレクトリ名に続くファイル名の先頭に p ⅸが入ります。 FILE * tmpfile (void) ・ tmpnam ( ) て、得た名前の一時ファイルを 作成し , FILE 構造体のポインタを返しま す。作成に失敗したら NULL を返します。 一時ファイルは fopen ( ) した直後に unlin k ( ) されているのて、 , あとてわざわざ消す必 要はありません。 fclose ( ) した時点て自動的 に消去されます。 djgcc 詳解講座・ Hello GCC World 75
' 92 年 1 月号特別付録 ( 5 ” 1.2M バイト 8 セ クタ / トラック MS-DOS フォーマット ) に は , 次のプログラムが収録されています。 ご使用にあたっては , 自動解凍圧縮ファイ ルの解凍方法など , さらに詳しい説明が収 録してある付録ディスクの README ( テキ ストファイル ) を必ずご一読ください GNIJ C 十十コンバイラ 「 DJGPP 」 本誌 : 91 年 10 月号に「 DJ' sGCC port to D OS 」を収録しましたが , ディスク容量の制限 のため , LIBSRCi* イレクトリのファイルと BIN/CCIPLUS. EXE は収録て、きませんてし た。今回 , 本誌特集「 C + 十と DJGPP 」にち なみ , C 十十の世界を実感していただければ と 10 月号て収録てきなかったファイルを収 録いたしました。なお , GNU C 十十をご使 用いただくためには本誌 ' 91 年 10 月号付録デ イスクに収録したファイルが必要てす。付 録ディスクには *DJGPP*DJGPP. EXE *DJGPP*L 旧 SRC. EXE という自動解凍圧縮ファイルて収録しまし た。収録したファイルは著作権告知と GNU GENERAL PUBLIC LICENSE(—般公有 使用許諾書 ) を兼ね備えた CopyIeft, および UCB code 配布規定 , djcode 配布規定によっ て保護されています。配付規定の詳細は *DJGPP*COPYING *DJGPP*COPYING. DJ を参照してください Pasca ロンバイラ 「カペソン」 新連載「実践アルゴリズム戦略」をご覧い いただけたてしようか ? 「実践アルゴリズ ム戦略」は好評連載中の「アルゴリズムとデ ータ構造入門」を補完する意味あいぞ , アル ゴリズム設計の戦略 ( アルゴリズムの作り 方 ) に重点をおいています。連載の特長のひ とっとして , 付録ディスクに C と Pa al て組 、ス *XGCC9*XGCC SR7. LZH ースファイル しました。また , いつものように XGCC のソ という圧縮ファイルにバイナリ差分を収録 *XGCC9*GCC. LZH 付録ディスクには い CC へとバージョンアップを行ってくださ 今月号の差分ファイルを使用して最新版 XG 7 月号の XGCC をバージョンアップした後 , 10 月号に収録した差分ファイルて 5 月号 , ります。 ル gcc. x, gcc ccl gcc_CPP. x カま必要とな X , 10 月号て、行ったバージョンアップファイ 号収録のファイル更新ユーティリティ BUP. 7 月号付録ディスクに収録した LHA. X , 9 月 今回のバージョンアップを行うには , ' 91 年 ップ同様 , バイナリ差分方式て、行います。 れました。前回 ' 91 年 10 月号のバージョンア 「 X68000 版 GCC 』がバージョンアップさ GNLJ C CompiIer9 X68000 に移植された たします。 スクて、ライプラリソース・ソースを収録い 除いたものを収録しました。次号付録ディ ます。今回はライプラリソース・ソースを 独立した圧縮ファイルとして配付されてい ント・ライプラリソース・ソースそれぞれ ました。なお , カペソンは実行・ドキュメ という自動解凍圧縮ファイルとして収録し *CABEZON*CABDC005 、 EXE *CABEZON*CABEX005. EXE 付録ディスクには ご期待ください。 ング言語 At 。 Z ( 仮題 ) 」ても登場いたします。 た。このカペソンは次号の特集「プログラミ ラ「カペソン ( Cabez 。 n ) 」を収録いたしまし 了解を得て自己記述可能な Pascal コンパイ いただくために著作権者 (ockeghem 氏 ) の す。そこて , PascaI プログラムを体験して んだサンプルプログラムを収録していきま も収録しました。 「 ANSI C 言語入門講座」 活用集⑨ ようこそ BohYoh ( 「ばうよう」と読みます / 本名て、す ) ディレクトリへ ! 毎月 , 初心者 のためのガイド ( 文書 ) やユーティリティな どを提供するディレクトリて、す。 今月の BohYoh ディレクトリは , PC ー 980 1 のグラフィック画面保存についてのプログ ラム ( 著作権者 : 立野繁之氏 ) てす。 付録ディスクに収録した *BOHYOH*BOHYOH. EXE は自動解凍圧縮ファイルてす。解凍方法に ついては README をご参照ください。 本誌掲載プログラム 今月の付録デ ~ イスクは , GNUC 十十コン パイラという大きなファイルを収録したた め本誌掲載プログラムも圧縮しました。 \ C MAGA というディレクトリの下に以下に示 す自動解凍圧縮ファイルを収録いたしまし た。解凍方法については README をご参照 ディスク内容のお知らせ 167 : インフォメーション ・迷走プログラミング PUZZLE. EXE : C マガ電脳クラブ TENSAKU. EXE : C MAGA セミナールーム : GCC て学ぶ 68 ゲーム : 応用 C 言語 C の道具箱 : C 言語雑学講座 : スタートアップ C 十十 MEIKAI. EXE : 明解 ANSI C 言語入門 : UNIX System V : 新 MS-DOS 入門 : djgcc 詳解講座 STRATE. EXE : 実践アルゴリズム戦略 TOKUSYU. EXE : 特集 C + 十と DJGPP QCFWIN. EXE : QuickC for WINDOWS DITHER. EXE : デイザリングを使って BERLIN. EXE : ベルリンまて何マイル INFO. EXE NIWA. EXE X68K. X OUYOU. EXE ZATU. EXE CPP. EXE UNIXCI. EXE MSDOS. EXE DJGCC. EXE
本誌付録ディスクに収録した X68000 版 GC C も今回で 2 度目のパージョンアップとなり ました。 10 月号での差分以来 , パソコン通 信などでの情報や多くの要望を取り入れて 大幅に変更・改良されています。今回は , 通常の連載にお休みをいただいてこの GCC について , 今までのバグや今回の改良点な どを説明したいと思います。 はじめに X68000 版 GCC は独立した処理系て、はな く , ライプラリとしてシャープの XC を必要 とします。また , 初代機以外て、はアセンプ ラ , リンカ ( これらはフリーウェアに純正品 より優れたものがありますが ) も必要なの て、 , 実質的には XC は必須となります。誤解 された読者もおられるようて、すが , 百科事 典並のマニュアルとライプラリの全ソース も付属していますのて、 , XC を購入されても 損はありません。 GCC を使うためにも入手 していただきたいと思います ( ちなみにディ スクをコピーしても意味がないて、しよう。 マニュアルが最大の「ウリ」て、すから ) 。 X68000 版 GCC は当然 FSF の GCC を基に 移植されているのて , 10 月号から連載され ている DJGCC のコマンドマニュアルがほと んどそのまま X68000 版にも通用します。 が , 細かな仕様は変更されています。ご注 意ください。また , 後述しますが今回の X6 X68k 活用講座 GCC で学ぶ 68 ゲーム プロクラミング 第 7 回 GCC X6-20(Based on 1.46 2 : 吉野智興 8000 版のコンパイラドライバはヘルプメッ セージを出力するのて、 , それをご覧くださ い XGCC C マガノヾージョンに 発見されたノヾグ りません。パソコン通信などて、バグを報告 するものて , GCC オリジナルのものて、はあ らのバグはすべて X68000 版独自拡張に起因 バグフィックスしてあります。なお , これ 以下のバグが発見・報告されましたのて、 , プリプロセッサのバグ ( 2 ) List LiSt 6 : macro(bbb) : 4 : #define 皿 cro ( 漢字 ) foo ( 漢字 ) ANSI 規格外 X680 圓版だけの仕様 * / 1 : / * 日本語マクロ引数が展開できないバグ プリプロセッサのノヾグ ( 1 ) 7 : 5 : 3 : していただいた方々に , 誌面を借りてあら ためてお礼を申し上げます。 プリプロセッサのバグ ( その 1 ) もともと , ANSI から逸脱していますが , 漢字をマクロの引数に使うと正しく展開て、 きませんて、した。 List 1 がその例てす。 プリプロセッサのバグ ( その 2 ) 実は , 環境変数 GCC OPTION に、、 P 〃の 文字を設定しておくと , C 十十形式のコメン 1 : / / c + + コメント許可状態で ( 環境変数 GCC ー OPTION に P を設定 , X6 ー 19 パージョンでは、 + ' ) 2 : / / 行の最後に、 \ ' コードの漢字文字を置くと行継続処理してしまう。 3 : 〃この機能は紙面上では未公開でした。 4 : / / もうひとつ、環境変数 GCC ー 0 円 ION に設定する文字の順番によっては 5 : / / この機能が動かなかった。また、 GCC ー ccl. x の出力コードを制御する 6 : / / 文字と競合してしまっていた。 9 : foo(); 11 : / / f00 ( ) : が消えてなくなってしまう X68k 活用講座 137