* C言語教科書【入門編】 [#gdbc3386]
-日経BP発行
-ISBN: 978-4-8222-8385-8 ([[Amazonより購入する:http://www.amazon.co.jp/exec/obidos/ASIN/4822283852/autumnmagazin-22]])
-2009/03/30 初版発行
-[[正誤情報:http://c.autumn.org/index.php?%E6%AD%A3%E8%AA%A4%E8%A1%A8#kf9a5deb]] (採点プログラムにも誤りが発見されていますので、ご確認下さい)

** まえがき [#wbb417bd]
 C言語の素晴らしさを伝えたい!

 本書は、C言語の美しさ、優れた機能性、時代を超えて通用する普遍性、そして知的興味を満たす面白さを皆さんに伝えたい、という筆者の情熱から企画されました。

 決まった解説メニューをこなすだけで、難しい点はごまかす安易な入門書ではありません。本書の続編を含めて読み通すことで、C言語の全貌がわかり、テクニックを駆使したベテランの書いたソースコードも読みこなせるようになることを目標とします。

 そして、安易な自己流の解釈や、特定製品だけで通用する常識は排し、定義や用語などは国際標準であるISO/IEC 9899:1999 Programming languages -- C(通称C99)およびその日本版であるJIS X 3010:2003 プログラム言語-Cを前提として、全世界に通用する本物のC言語を解説します。それだけでは足りない部分に関しては、特定製品依存の機能をそれと断って活用することもためらいません。

 また、多くのベテランCプログラマから要望の多い「コマンドラインでコンパイルする」「1つのコンパイラだけを体験するので終わってしまわない」という点にも重点的に配慮しました。本書はコマンドライン操作を前提とし、Visual C++のCコンパイラと、MinGWのgccという2つのCコンパイラの双方で実習を進める形式を採ります。

 一方で読者の負担も配慮し、一般的なWindowsパソコン(XP以降)が1台あればすべての実習が可能となるように配慮しています。

 さあ。C言語に興味はあるが勉強はつらそうだと思っているあなたや、他の入門書で納得しきれなかったあなた。今こそ、本書で魅惑のC言語の世界に飛び立ちましょう。

 本書は、日経ソフトウエア2005年7月号より連載された「基本はいつもC言語」および2006年7月号より連載された「実用Cプログラミング・テクニック」の2つの連載と、他の一部の記事原稿を再構成したものです。内容を全面的に見直し、大幅な加筆修正も行っています。また、雑誌掲載時に誌面の都合でカットされたコラムなども大幅に復活していますので、連載をお読みになった方もご注目ください。本書が真の完全版です。

** 目次 [#e82d9e4a]
 以下は校正版ベースなのでページ数等に相違があるかもしれません。

*** まえがき ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ iii [#zd04332e]
*** 第1部 初めてC に触れる [#e9cdc1b3]
*** 第1章 C 言語とは [#gb34ff23]
 C はあなたに何を与えるか 1
 なぜC を学ぶのか ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 2
 プログラミング言語とは何か ・・・・・・・・・・・・・・・・・・・・・・・・・ 2
 C を学ぶもう1 つの理由 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 4
 なぜ教科書を用いるのか ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 5
 コラム プログラムとソフトウェア ・・・・・・・・・・・・・・・・・・・・・・ 6
 コラム チャレンジ問題と採点プログラム ・・・・・・・・・・・・・・・ 6
*** 第2章 コマンドライン操作 [#aead2bfa]
 シンプルかつ強力な操作体系 9
 文字による操作に取り組もう ・・・・・・・・・・・・・・・・・・・・・・・・ 10
 コマンドプロンプトを操作する ・・・・・・・・・・・・・・・・・・・・・・ 11
 拡張子の役割 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 13
 コラム テキストエディタ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 15
 コマンドライン ヒストリの活用 ・・・・・・・・・・・・・・・・・・・・・ 15
 基本的なコマンド ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 16
 ワイルドカード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 19
 処理を自動化するバッチ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 20
 実行するコマンドの指定方法 ・・・・・・・・・・・・・・・・・・・・・・・・ 21
 コラム Windows 以外で使用するコマンド ・・・・・・・・・・・・ 22
*** 第3章 ハローワールド [#y17b65bf]
 最も簡単なプログラム 23
 ハローワールドを書く ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 24
 コンパイラの役割 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 24
 C 言語に関するファイルの役割 ・・・・・・・・・・・・・・・・・・・・・・ 25
*** 第4章 Visual C++ の使い方 29 [#t1de6bcd]
 Visual C++ の概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 30
 統合開発環境を使う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 31
 ソースファイルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 33
 プログラムの実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 36
 コマンドラインを使う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 38
 ソースファイルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 38
 コンパイル ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 40
 プログラムの実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 41
*** 第5章 gcc(MinGW)の使い方 43 [#w50e5868]
 gcc の概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 44
 MinGW の概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 44
 コマンドラインを使う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 45
 実行ファイル名を指定する ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 46
 ソースファイルに日本語文字を書き込む ・・・・・・・・・・・ 47
 コラム エラーの起こる文字一覧プログラム ・・・・・・・・・・・ 50
 コラム cp932 の指定が有効にならないケース ・・・・・・・・ 50
*** 第6章 標準出力 [#f5921efb]
 ファイルにも画面にも出力 53
 ハローワールドプログラムをとことん楽しむ・・・・・・ 54
 わずかな労力で多くの機能を ・・・・・・・・・・・・・・・・・・・・・・・・ 57
 最初に実行される関数main ・・・・・・・・・・・・・・・・・・・・・・・・・・ 60
 ライブラリという機能 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 60
 ライブラリ活用のためのヘッダファイル ・・・・・・・・・・・ 62
*** 第7章 標準入力 [#k87f4ab0]
 キーボードやファイルから入力 65
 「決まり切った文字列」を卒業しよう ・・・・・・・・・・・・・・・・ 66
 標準入力のチカラ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 68
 プログラムの構造 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 69
 コラム バッファオーバーランの危険 ・・・・・・・・・・・・・・・・・・・ 71
 コラム _mbsupr 関数を使わずに記述する ・・・・・・・・・・・・ 72
*** 第8章 条件判断 [#v4c454ce]
 プログラムに賢さを与える 73
 知恵のタネとなる条件判断 ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 74
 もしも入力が空だったら? ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 74
 ソースコードの説明 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 76
 コラム どこにも送られない特殊なファイル名 ・・・・・・・・・ 68
 金額によって処理を分ける ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 79
 コラム 整数とは ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 82
 コラム さまざまな条件 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 84
 コラム return 文 ・ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 84
 合い言葉は「山」「川」 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 84
 コラム その他の条件判断機能 ・・・・・・・・・・・・・・・・・・・・・・・・・・ 89
 コラム 文字列の比較に== を使用できない理由 ・・・・・・ 89
*** 第9章 繰り返し [#a3e62016]
 プログラムに力を与える 91
 プログラムの「力」は繰り返しにあり ・・・・・・・・・・・・・・・・ 92
 羊を数える ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 93
 回数を指定した繰り返し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 98
 2 重の繰り返し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 103
 コラム 繰り返しに使う変数名 ・・・・・・・・・・・・・・・・・・・・・・・・ 104
 Upper1 を任意の行数に拡張する ・・・・・・・・・・・・・・・・・ 107
 コラム コントロールキーの活用 ・・・・・・・・・・・・・・・・・・・・・・ 112
 コラム 繰り返しはパターンを決めよう ・・・・・・・・・・・・・・ 112
 コラム 決まらない回数の繰り返し ・・・・・・・・・・・・・・・・・・・ 113
*** 第10章 配列と文字列 [#x673aabb]
 文字イコール数値という不思議 115
 多数のデータを効率よく記憶する配列 ・・・・・・・・・・・ 116
 複数の番号について集計する ・・・・・・・・・・・・・・・・・・・・・・ 117
 配列の範囲外アクセス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 121
 文字列イコール配列 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 123
 コラム ' ¥n' と" ¥n" の違い ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 127
 文字とは実は数字である ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 128
 漢字を正しく逆転させるには ・・・・・・・・・・・・・・・・・・・・・・ 132
 10 進数と16 進数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 132
 1 バイト文字と2 バイト文字の区別 ・・・・・・・・・・・・・・ 135
 コラム 配列の範囲外アクセスの必要性 ・・・・・・・・・・・・・・ 139
 コラム setlocale 関数の機能 ・・・・・・・・・・・・・・・・・・・・・・・・・ 140
 コラム 1 バイト目と2 バイト目の英語表記 ・・・・・・・・・ 140
 コラム データの入った配列を宣言する ・・・・・・・・・・・・・・ 141
 コラム 文字列の入った配列を宣言する ・・・・・・・・・・・・・・ 142
*** 第11章 ポインタ [#a9b094af]
 最大の難敵にして最強の味方 143
 さあ、いよいよポインタだ ・・・・・・・・・・・・・・・・・・・・・・・・・ 144
 メモリ空間は巨大な配列 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 144
 ポインタでメモリ空間を扱う ・・・・・・・・・・・・・・・・・・・・・・ 149
 ポインタを知ればライブラリ関数を活用できる ・・・ 154
 整数型のポインタ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 158
 コラム char とunsigned char ・・・・・・・・・・・・・・・・・・・・・・ 162
 コラム なぜunsigned char を使うのか? ・・・・・・・・・・ 162
 コラム 配列ではない変数のポインタ値を得る ・・・・・・・ 163
 コラム 数値をバラバラに分解する ・・・・・・・・・・・・・・・・・・・ 164
 コラム データのサイズの注意 ・・・・・・・・・・・・・・・・・・・・・・・・ 166
*** 第12章 関数 [#uc38a7cb]
 同じコードを繰り返し書く無駄を排除せよ 167
 一括置換では直せない ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 168
 重複を取り除こう ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 169
 関数を自作する ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 172
 引数を使って関数自由自在 ・・・・・・・・・・・・・・・・・・・・・・・・・ 175
 返却値で結果を返す ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 168
 有効範囲(スコープ)という罠 ・・・・・・・・・・・・・・・・・・・・・・ 182
 main 関数の引数と返却値を使う ・・・・・・・・・・・・・・・・・・ 186
 引数の受け取り方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 189
 返却値の返し方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 190
*** 第13章 構造体 [#a3662abb]
 データを結集すれば力も倍増 193
 データをまとめて扱う意義 ・・・・・・・・・・・・・・・・・・・・・・・・・ 194
 なぜひとまとめにするか ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 194
 構造体を宣言する ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 198
 目次
 iv
 Cgen_000_iv_ix_moku(06).indd 4-5 09.2.27 2:06:44 PM
 目次
 構造体を使う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 199
 struct キーワードを書かないで済ませるには ・・・ 202
 構造体で引数を簡単にできる ・・・・・・・・・・・・・・・・・・・・・・ 206
 構造体の配列 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 209
 構造体で実現するリンクリスト ・・・・・・・・・・・・・・・・・・・・ 210
 コラム 入力通りに列挙する ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 216
*** 第14章 ファイル入出力 [#qdecb58b]
 複数のファイルを自在に操れ 219
 標準入出力からの巣立ち ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 220
 この2 つのファイルは同じものか? ・・・・・・・・・・・・・・ 220
 ファイルを比較する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 224
 ファイルのオープンとクローズ ・・・・・・・・・・・・・・・・・・・・ 226
 gets 関数とfgets 関数の相違点 ・・・・・・・・・・・・・・・・・・・ 228
 複数のファイルを1 つにまとめる ・・・・・・・・・・・・・・・・・ 230
 複数のファイルに分割して書き込む ・・・・・・・・・・・・・・ 235
 コラム fclose 関数の効能 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 240
 コラム FILE 構造体の定義 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 242
*** 第15章 小さな実用ソフト [#acfea3d1]
 検索+ソート+ユニークの自作に挑戦 243
 効果的なC の学習法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 244
 検索、ソート、ユニーク ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 244
 ワイルドカード対応の検索ツール ・・・・・・・・・・・・・・・・・ 247
 1 つの繰り返しを1 つの関数で ・・・・・・・・・・・・・・・・・・・・ 251
 順番に並べ替えるソート ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 256
 泡のようにソートせよ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 258
 bsort のソースを読む ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 259
 バブルソートを行う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 262
 ユニークな結末 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 264
 コラム DBCS イネーブリング ・・・・・・・・・・・・・・・・・・・・・・・・ 265
 コラム true とfalse ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 266
 コラム qsort 関数のアルゴリズム ・・・・・・・・・・・・・・・・・・・ 266
*** 第16章 デバッグ [#f643b73d]
 “本物”のプログラマに必須のテクニック 267
 誤りはどうしても入り込む ・・・・・・・・・・・・・・・・・・・・・・・・・ 268
 デバッグの重要性 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 270
 デバッガを使わないデバッグ ・・・・・・・・・・・・・・・・・・・・・・ 271
 名探偵を目指せ——推理と絞り込み ・・・・・・・・・・・・・・ 271
 違う角度からソースを見る ・・・・・・・・・・・・・・・・・・・・・・・・・ 273
 誰もが知る有名テクニック——printf デバッグ ・・・・ 274
 コラム 使い終わったprintf 関数呼び出しの処置 ・・・ 278
 ファイルへのデバッグ出力 ・・・・・・・・・・・・・・・・・・・・・・・・・ 279
 あるべき値を保証するassert ・・・・・・・・・・・・・・・・・・・・・・ 282
 デバッグ用途に使うassert ・・・・・・・・・・・・・・・・・・・・・・・・ 284
 コラム C では特に重要なデバッグ ・・・・・・・・・・・・・・・・・・・ 287
 コラム 原因を絞り込めないケース ・・・・・・・・・・・・・・・・・・・ 287
 コラム 自分に責任のないバグ ・・・・・・・・・・・・・・・・・・・・・・・・ 288
 コラム assert マクロはエラーチェック用ではない ・・・・ 288
*** 第17章 実用プログラムの開発 [#w13e2d1b]
 CSV ファイルを扱うプログラムを作ろう 289
 リミッターを1 つ解除しよう ・・・・・・・・・・・・・・・・・・・・・・ 290
 CSV ファイルとは何か ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 290
 敵を知る——仕様書はどこだ? ・・・・・・・・・・・・・・・・・・・・ 292
 CSV ファイルの詳細 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 293
 コーディングを始める前の2 つの注意点 ・・・・・・・・ 295
 関数の仕様を考える ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 297
 CSV の迷宮を踏み越えろ ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 299
 readRecord 関数の内容 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 302
 readRecord 関数の使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・ 305
 readRecord 関数の活用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 307
 コラム 1 つの配列に複数の文字列を入れる ・・・・・・・・・・ 313
 コラム 0 と1 の論理世界 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 314
*** 第2部 入門者を卒業する [#h10086c8]
*** 第18章 式と演算子 [#t0ca41da]
 優先順位にご用心 317
 C 言語における式 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 348
 演算子の一覧 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 348
 優先順位の問題 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 320
 コラム 式の評価の難しさ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 321
*** 第19章 マクロ [#gb89207e]
 それはソースの自動書き換え 323
 C なのにVisual Basic 風? ・・・・・・・・・・・・・・・・・・・・・・・ 324
 ヘッダファイルとマクロのトリック ・・・・・・・・・・・・・・ 327
 マクロの役割 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 331
 関数のように使うマクロ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 334
 マクロの副作用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 337
 長いマクロの書き方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 338
 マクロの性能 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 341
 マクロの使い過ぎは肥満の元 ・・・・・・・・・・・・・・・・・・・・・・ 344
 コラム 整数と実数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 347
*** 第20章 高度なマクロ [#q45b3e61]
 ソースを差し替え、コンパイル時刻を刻み込む 349
 品川までは何マイル? ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 350
 条件判断に使うマクロ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 351
 #ifdef で実現する品川からの距離 ・・・・・・・・・・・・・・・・ 351
 コラム if と#ifdef の違いは何か ・・・・・・・・・・・・・・・・・・・・ 354
 コラム スイッチを組み込む理由 ・・・・・・・・・・・・・・・・・・・・・・ 356
 もっとエレガントに判断する ・・・・・・・・・・・・・・・・・・・・・・ 356
 コラム 長い文字列を分割して記述する ・・・・・・・・・・・・・・ 360
 デバッグの手助けに使うマクロ ・・・・・・・・・・・・・・・・・・・・ 361
 コンパイルした日時を記録する ・・・・・・・・・・・・・・・・・・・・ 365
 コラム 既存のマクロを調べる ・・・・・・・・・・・・・・・・・・・・・・・・ 366
 コラム 文字列化と名前の連結 ・・・・・・・・・・・・・・・・・・・・・・・・ 367
 コラム マクロの解除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 369
 コラム 入力を処理するscanf ・・・・・・・・・・・・・・・・・・・・・・・・ 371
*** 第21章 モジュール化プログラミング [#l7db7c83]
 複数のソースファイルに分けて書く 373
 プログラミングを3 人で分担 ・・・・・・・・・・・・・・・・・・・・・・ 374
 モジュール化プログラミングの考え方 ・・・・・・・・・・・ 374
 モジュール間の関係を取り決める ・・・・・・・・・・・・・・・・・ 376
 リンクをせずにコンパイルだけする ・・・・・・・・・・・・・・ 379
 実行できないファイルを作成する理由 ・・・・・・・・・・・ 381
 ヘッダファイルのもう1 つの効能 ・・・・・・・・・・・・・・・・・ 382
 おっと設計変更だ! ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 384
 またまた設計変更だ! ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 386
 同じ名前の関数の衝突回避 ・・・・・・・・・・・・・・・・・・・・・・・・・ 387
 いよいよ実行ファイルを作る ・・・・・・・・・・・・・・・・・・・・・・ 388
 モジュール化プログラミングとは何か ・・・・・・・・・・・ 389
 コラム モジュール間で変数を共有する方法 ・・・・・・・・・ 392
 コラム 構造化とオブジェクト指向とモジュール化 ・・・・ 393
 コラム 関数の前方参照と関数原型宣言 ・・・・・・・・・・・・・・ 394
 コラム unsafe 警告の問題 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 396
*** 第22章 make 入門 [#r647b46c]
 実行ファイル作成の自動化 397
 横着は人類を進歩させる ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 398
 make でHello World! ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 399
 もっと楽をしたいぞ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 402
 集計プログラムの実行にmake を試す ・・・・・・・・・・・ 403
 make の秘密はタイムスタンプにあり ・・・・・・・・・・・・ 405
 シンプルな一発make ・ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 407
 オブジェクトファイル単位に分けるmake ・・・・・・ 409
 full.mak の説明 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 412
 コラム make の仲間たち ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 414
 vi vii
 Cgen_000_iv_ix_moku(06).indd 6-7 09.2.27 2:06:46 PM
 目次
*** 第23章 make 入門その2 [#w7921383]
 実行ファイル作成の効率化 415
 make の快楽 ・ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 416
 暗黙のルールで依存関係をシンプルに ・・・・・・・・・・・ 418
 マクロによる記述 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 422
 定義済みのルール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 425
 ターゲット指定による作り分け ・・・・・・・・・・・・・・・・・・・・ 426
 ゴミ掃除の自動化 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 429
 コラム メイクファイルもインクルード ・・・・・・・・・・・・・・ 431
 コラム コマンドラインでのマクロ指定 ・・・・・・・・・・・・・・ 432
*** 第24章 標準エラー出力 [#j3369026]
 入口1 つで出口が2 つ 433
 あなたの目の前にある標準エラー出力 ・・・・・・・・・・・ 434
 決まり切ったメッセージの抑止 ・・・・・・・・・・・・・・・・・・・・ 436
 標準エラー出力への出力方法 ・・・・・・・・・・・・・・・・・・・・・・ 437
 エラー処理を強化する切り札perror ・・・・・・・・・・・・・・ 440
 perror の引数の書き方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 444
 より確実なプログラムにするには ・・・・・・・・・・・・・・・・・ 445
 実際のプログラムで使う標準エラー出力 ・・・・・・・・・ 447
 コラム 標準C とエラー番号 ・・・・・・・・・・・・・・・・・・・・・・・・・・ 454
*** 第25章 バイナリファイル [#ecf3cbb2]
 画像データも扱おう 455
 バイナリファイルとは何か? ・・・・・・・・・・・・・・・・・・・・・・ 456
 BMP ファイルの構造 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 458
 BMP ファイルを加工する ・・・・・・・・・・・・・・・・・・・・・・・・・・ 460
 画像を処理する仕掛け ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 463
 パイプを通らないバイナリ ・・・・・・・・・・・・・・・・・・・・・・・・・ 466
 強力画像加工ツールnetpbm ・・・・・・・・・・・・・・・・・・・・・・・ 470
 標準入出力でバイナリを扱う方法 ・・・・・・・・・・・・・・・・・ 471
 連携でパワーアップ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 473
 コラム テキストファイルとワープロ文書 ・・・・・・・・・・・・ 475
 コラム テキストファイルとOOXML ・・・・・・・・・・・・・・・・ 476
 コラム テキストファイル形式の画像ファイル ・・・・・・・ 476
 コラム fopen 関数で“b”が必要とされるケース ・・・・ 477
 コラム 改行の混乱 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 477
 コラム 筆者の実体験 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 478
 コラム _setmode 関数が必要とされないとき ・・・・・・・ 478
*** 第26章 関数へのポインタ [#lf960dd6]
 オブジェクト指向「風」プログラミングの入口 479
 C とオブジェクト指向プログラミング ・・・・・・・・・・・ 480
 ポリモーフィズム ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 480
 関数へのポインタ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 482
 構造体でオブジェクトを表現 ・・・・・・・・・・・・・・・・・・・・・・ 486
 ポリモーフィズムの活用例 ・・・・・・・・・・・・・・・・・・・・・・・・・ 486
 オブジェクトを作るファクトリ ・・・・・・・・・・・・・・・・・・・・ 490
 コラム 乱数を使う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 490
 「より良く書くことができる」世界へ踏みだそう! ・・・ 492
 コラム「 スローフード」としてのC 言語 ・・・・・・・・・・・・・ 493
*** 付録1  Visual C++ 2008 Express Edition のインストール 495 [#nac5569d]
 インストール環境の確認 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 496
 入手とインストール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 496
 動作の確認 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 502
*** 付録2 MinGW のインストール 503 [#mdd6d1c5]
 インストール環境の確認 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 504
 入手とインストール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 505
 動作の確認 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 513
 環境変数の設定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 514
*** 付録3 16進ダンププログラムhexdump 517 [#ea1ec692]
 こだわりの文字ダンプ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 518
 ソースコードの解説 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 519
*** 付録4 環境変数 523 [#l90b3edd]
 cl やgcc を実行できる謎 ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 524
 環境変数というカスタマイズ手段 ・・・・・・・・・・・・・・・・・ 525
 自分専用の環境変数を作ろう ・・・・・・・・・・・・・・・・・・・・・・ 527
 環境変数でカスタマイズ可能なプログラム ・・・・・・ 529
 プログラムから環境変数を書き換える ・・・・・・・・・・・ 531
 書き込んでも環境変数が変わらない理由 ・・・・・・・・・ 532
 子プロセスには引き継げる ・・・・・・・・・・・・・・・・・・・・・・・・・ 533
 コラム 環境変数の削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 536
 コラム 環境変数の恒久的な書き換え ・・・・・・・・・・・・・・・・・ 537
 コラム 環境変数PATH の書き換え ・・・・・・・・・・・・・・・・・・ 537
*** 付録5  コンパイラの主要なエラーメッセージと対策 539 [#ma5652f5]
 ヘッダファイルの書き忘れ ・・・・・・・・・・・・・・・・・・・・・・・・・ 540
 main 関数名前間違い ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 540
 変数の宣言忘れ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 541
 宣言したのに使われない変数 ・・・・・・・・・・・・・・・・・・・・・・ 542
 同じ名前の変数を2 つ定義 ・・・・・・・・・・・・・・・・・・・・・・・・・ 542
 別の型の変数に代入 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 543
 存在しない関数の呼び出し ・・・・・・・・・・・・・・・・・・・・・・・・・ 544
 違う型の値を関数に渡す ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 545
 関数の引数が多すぎる ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 545
 関数の引数が少なすぎる ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 546
 引用符忘れ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 547
 引用符の種類間違い ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 548
 文字列中の円記号 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 548
 実数から整数への代入 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 549
 括弧の数が合わない ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 550
 全角文字で書いた ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 551
 全角空白を入れた ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 551
 ソースコードをUnicode 形式で保存した ・ ・・・・・・ 552
 安全ではない関数を使用した ・・・・・・・・・・・・・・・・・・・・・・ 553
*** 付録6  デバッガを使ったデバッグVisual C++ 編 555 [#vcf830d7]
 デバッガでプログラムを覗く ・・・・・・・・・・・・・・・・・・・・・・ 556
 デバッガでステップ実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 559
 その他の機能 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 561
*** あとがき・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・562 [#y8f2b533]
*** 索引 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・563 [#p885b9f7]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS