Contents
開発環境のセットアップ
1. Visual Studio 2022(Community)
Why: Microsoft が提供するフル機能 IDE。デバッガ、プロファイラ、IntelliSense が標準装備されており、初心者でもエラー箇所を直感的に把握できます。
| 手順 | 内容 |
|---|---|
| 1 | https://visualstudio.microsoft.com/ja/vs/ にアクセスし Community エディションをダウンロード |
| 2 | インストーラで 「C++ デスクトップ開発」 ワークロードを選択 |
| 3 | 個別コンポーネントで 「MSVC v143 – VS 2022 C++ コンパイラツールセット」 と 「Windows 10 SDK (10.0.x)」 を必ずチェック |
| 4 | インストール完了後、Tools → Options → Projects and Solutions → VC++ Directories が自動的に設定されていることを確認 |
注意点(プラットフォーム別)
- Windows:MSVC が標準コンパイラです。cl.exeのバージョンはv143(Visual Studio 2022)です。
- macOS / Linux で VS 2022 は利用できません。その場合は VS Code + GCC/Clang 組み合わせを推奨します。
2. Visual Studio Code(マルチプラットフォーム版)
| OS | インストール方法 |
|---|---|
| Windows (Chocolatey) | choco install vscode |
| macOS (Homebrew) | brew install --cask visual-studio-code |
| Ubuntu/Debian | sudo apt update && sudo apt install code |
必須拡張機能
- C/C++(Microsoft) – IntelliSense、デバッグ、コードナビゲーション
- GitLens – Git 操作の可視化
- Code Runner (任意) – ワンクリックで実行
settings.json に以下を追記し、ビルドタスクと実行コマンドを統一します。
|
1 2 3 4 5 6 7 8 |
{ "C_Cpp.intelliSenseEngine": "Default", "files.associations": { "*.c": "c" }, "code-runner.executorMap": { "c": "gcc \"$fullFileName\" -o \"${fileDirname}/${fileBasenameNoExtension}\" && \"${fileDirname}/${fileBasenameNoExtension}\"" } } |
プラットフォーム別の注意
- macOS / Linux ではgccがデフォルトでclangにシンボリックリンクされていることがあります。コンパイラを明示したい場合は"code-runner.executorMap.c": "clang ..."と書き換えてください。
3. GCC / Clang の導入(クロスプラットフォーム対応)
| OS | コマンド例 |
|---|---|
| Windows (MSYS2) | pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-clang |
| macOS (Homebrew) | brew install gcc clang |
| Ubuntu/Debian | sudo apt install build-essential clang |
インストール後は次のコマンドでバージョンが表示されることを確認してください。
|
1 2 3 |
gcc --version # 例: gcc (Ubuntu 12.2.0-3ubuntu1) 12.2.0 clang --version # 例: clang version 15.0.7 |
4. Git とリモートリポジトリの準備
| 手順 | 内容 |
|---|---|
| 1 | https://git-scm.com/downloads から OS に合わせてインストール |
| 2 | グローバル設定git config --global user.name "Your Name"git config --global user.email your@email.com |
| 3 | GitHub(または GitLab)でアカウント作成 → New repository → c-language-7days(公開可)を作成 |
| 4 | ローカルにクローンし、学習用ディレクトリ構造を作る |
|
1 2 3 4 5 6 7 |
git clone https://github.com/yourname/c-language-7days.git cd c-language-7days mkdir day01 && touch day01/main.c git add . git commit -m "Initialize repository for 7‑day C learning plan" git push origin main |
ベストプラクティス
-.gitignoreに*.o,*.exe,build/を追加してビルド成果物を除外。
- 毎日少なくとも 1 回はコミットし、学習ログとして残す。
7 日間学習ロードマップ
| Day | テーマ | 学習目標(アウトプット) | 主な学習リソース |
|---|---|---|---|
| 1 | 基本構文と変数 | Hello World と型ごとの出力 |
書籍 p.10‑12、公式チュートリアル |
| 2 | 制御フロー | if/else, for, while を使って九九表作成 | 書籍 p.20‑22 |
| 3 | 関数とヘッダー分割 | add 関数を別ファイルに実装 |
書籍 p.30‑33 |
| 4 | 配列・ポインタ | バブルソート実装+ポインタ演算の体感 | 書籍 p.40‑44 |
| 5 | 文字列 & ファイル I/O | ユーザー入力をテキストファイルに保存 | 書籍 p.50‑53 |
| 6 | デバッグ・単体テスト | VS 2022 のデバッガと assert.h 活用 |
書籍 p.60‑62 |
| 7 | ミニプロジェクト | TODO リスト CLI アプリ完成 → GitHub 公開 | 書籍 p.70‑78 |
学習の進め方
- ハンズオン実装 → 手を動かすことが最優先。
- ビルド & 実行 →
gcc -Wall -Wextraで警告は全て解消する。 - テスト →
assertまたは簡易スクリプトで結果を検証。 - 振り返り → 完了したら Markdown のチェックリストに ✅ を入れる。
ハンズオン課題とサンプルコード
各コード例にはエラーハンドリング、プラットフォーム別の注意点、そして
-Wall -Wextraで警告が出ないように書かれています。
Day 1 ― Hello World と基本変数
|
1 2 3 4 5 6 7 8 9 10 11 12 |
/* hello.c */ #include <stdio.h> int main(void) { int i = 10; float f = 3.14f; // 'f' を付けて単精度リテラルを明示 char c = 'A'; printf("int: %d float: %.2f char: %c\n", i, f, c); return 0; } |
ビルド例(Windows)
|
1 2 |
cl /W4 /EHsc hello.c // MSVC の場合 |
ビルド例(Linux/macOS)
|
1 2 3 |
gcc -Wall -Wextra -o hello hello.c ./hello |
ポイント
-printfの書式指定子は型に合わせる。
- 文字列リテラルの末尾に改行が無いとプロンプトが同じ行に残ります。
Day 2 ― 条件分岐・ループ(九九表)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* multiplication.c */ #include <stdio.h> int main(void) { for (int i = 1; i <= 9; ++i) { for (int j = 1; j <= 9; ++j) { printf("%d×%d=%2d ", i, j, i * j); } putchar('\n'); } return 0; } |
エラーハンドリングは不要ですが、printf の戻り値をチェックする例
|
1 2 3 4 5 |
if (printf("...") < 0) { perror("printf failed"); return 1; } |
Day 3 ― 関数とヘッダー分割
ディレクトリ構成
|
1 2 3 4 5 |
day03/ ├─ main.c ├─ add.h └─ add.c |
add.h
|
1 2 3 4 5 6 7 8 |
#ifndef ADD_H #define ADD_H /** 2 整数の加算を行う */ int add(int a, int b); #endif // ADD_H |
add.c
|
1 2 3 4 5 6 |
#include "add.h" int add(int a, int b) { return a + b; } |
main.c
|
1 2 3 4 5 6 7 8 9 |
#include <stdio.h> #include "add.h" int main(void) { int sum = add(3, 4); printf("3 + 4 = %d\n", sum); return 0; } |
ビルド(MSVC)
|
1 2 |
cl /W4 main.c add.c |
ビルド(GCC/Clang)
|
1 2 3 |
gcc -Wall -Wextra -o day03 main.c add.c ./day03 |
注意点
- ヘッダーガード (#ifndef … #define …) で二重インクルードを防止。
- 関数プロトタイプはヘッダーにだけ記述し、実装側では#include "add.h"を必ず行う。
Day 4 ― 配列とポインタ(バブルソート)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/* bubble_sort.c */ #include <stdio.h> void bubble_sort(int *arr, size_t n) { for (size_t i = 0; i < n - 1; ++i) { for (size_t j = 0; j < n - i - 1; ++j) { if (*(arr + j) > *(arr + j + 1)) { int tmp = *(arr + j); *(arr + j) = *(arr + j + 1); *(arr + j + 1) = tmp; } } } } int main(void) { int data[] = {5, 2, 9, 1, 6}; size_t n = sizeof(data) / sizeof(data[0]); bubble_sort(data, n); for (size_t i = 0; i < n; ++i) printf("%d ", data[i]); putchar('\n'); return 0; } |
エラーハンドリング例(配列サイズが 0 の場合)
|
1 2 3 4 5 |
if (n == 0) { fprintf(stderr, "Error: empty array\n"); return 1; } |
Day 5 ― 文字列操作とファイル I/O
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
/* notes.c */ #include <stdio.h> #include <stdlib.h> int main(void) { char line[256]; FILE *fp = fopen("notes.txt", "a"); if (!fp) { perror("fopen"); return EXIT_FAILURE; } printf("メモを書いて Enter: "); if (!fgets(line, sizeof(line), stdin)) { fprintf(stderr, "入力エラー\n"); fclose(fp); return EXIT_FAILURE; } if (fprintf(fp, "%s", line) < 0) { perror("fprintf"); fclose(fp); return EXIT_FAILURE; } fclose(fp); puts("保存しました。"); return EXIT_SUCCESS; } |
プラットフォーム別注意
- Windows の場合、テキストモード ("a"または"a+") が改行コード\r\nに自動変換します。Unix 系ではそのまま\nが書き込まれます。
Day 6 ― デバッグと単体テスト
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/* factorial_test.c */ #include <stdio.h> #include <assert.h> /* 再帰的に階乗を計算する関数 */ int factorial(int n) { if (n <= 1) return 1; return n * factorial(n - 1); } int main(void) { /* assert はデバッグビルドで有効になるので、リリース時は NDEBUG を定義して無効化できる */ assert(factorial(0) == 1); assert(factorial(5) == 120); puts("All tests passed."); return 0; } |
デバッグ手順(Visual Studio 2022)
factorial行にブレークポイントを設定- Debug → Start Debugging (
F5) - ローカル変数ウィンドウで
nの推移とスタックフレームを確認
Tips:デバッグビルドでは
/Zi /DEBUGが自動付与され、最適化が抑制されます。最終リリースは/O2で最適化してください。
Day 7 ― ミニプロジェクト:TODO リスト CLI アプリ
主要ソースファイル
main.c– コマンドライン引数解析task.h / task.c– タスク管理ロジックstorage.c– ファイル永続化
task.h
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#ifndef TASK_H #define TASK_H typedef struct { int id; char desc[128]; int done; // 0: 未完了, 1: 完了 } Task; #define MAX_TASKS 100 extern Task tasks[MAX_TASKS]; extern int task_cnt; /* API */ void add_task(const char *desc); void list_tasks(void); int mark_done(int id); int save_tasks(const char *path); int load_tasks(const char *path); #endif // TASK_H |
task.c(抜粋)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include "task.h" #include <string.h> #include <stdio.h> Task tasks[MAX_TASKS]; int task_cnt = 0; void add_task(const char *desc) { if (task_cnt >= MAX_TASKS) { fprintf(stderr, "タスク上限に達しました\n"); return; } Task *t = &tasks[task_cnt]; t->id = task_cnt + 1; strncpy(t->desc, desc, sizeof(t->desc) - 1); t->desc[sizeof(t->desc) - 1] = '\0'; t->done = 0; ++task_cnt; } |
main.c(コマンド解析例)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include <stdio.h> #include <string.h> #include "task.h" int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "Usage: todo <add|list|done> [args]\n"); return 1; } if (strcmp(argv[1], "add") == 0 && argc >= 3) { add_task(argv[2]); save_tasks("tasks.db"); puts("タスクを追加しました。"); } else if (strcmp(argv[1], "list") == 0) { load_tasks("tasks.db"); list_tasks(); } else if (strcmp(argv[1], "done") == 0 && argc >= 3) { int id = atoi(argv[2]); if (mark_done(id)) { save_tasks("tasks.db"); puts("完了フラグを設定しました。"); } else { puts("該当タスクがありません。"); } } else { fprintf(stderr, "不正なコマンドです\n"); return 1; } return 0; } |
ビルド例(クロスプラットフォーム)
|
1 2 3 4 |
gcc -Wall -Wextra -o todo main.c task.c storage.c ./todo add "Read C language book" ./todo list |
リポジトリへのコミット例
|
1 2 3 4 |
git add . git commit -m "Day7: TODO CLI アプリ完成" git push origin main |
学習進捗の管理とアウトプット
1. Markdown チェックリスト(GitHub 上で可視化)
|
1 2 3 4 5 6 7 8 |
- [x] Day1: Hello World 実装 - [x] Day2: 条件分岐・ループ九九表 - [x] Day3: 関数とヘッダー分離 - [x] Day4: 配列・ポインタ バブルソート - [x] Day5: 文字列入力 → ファイル保存 - [x] Day6: デバッグ&assert テスト - [x] Day7: TODO アプリ完成 & GitHub 公開 |
2. 日次クイズで定着度チェック
| Day | クイズ例 | 自己採点基準 |
|---|---|---|
| 3 | ヘッダーガードが必要な理由は? | 正解:二重インクルード防止(100%) |
| 4 | *(arr + j) と arr[j] の違いは? |
同等であることを説明できれば合格 |
| 6 | assert が無効になる条件は? |
NDEBUG 定義時に無効になると答えられたら OK |
3. Pull Request を活用した振り返り
- 毎週金曜 に
Week‑Reviewブランチを作成 README.mdに今週の学習まとめ、課題点、次週の目標を書き足す- プルリクエストを作成し、メンターや同僚にレビュー依頼
メリット:コードだけでなくドキュメント化スキルも同時に鍛えられます。
実務で役立つコード品質の基礎
| 項目 | ベストプラクティス | 具体例 |
|---|---|---|
| コメント | 「何をやっているか」+「なぜやるか」を明示 | // バブルソート: 隣接要素を比較し大きい方を右へ移動 |
| 命名規則 | snake_case 推奨、長さは 15 文字以内 | int total_score;(OK) vs int TotalScore;(NG) |
| 関数分割 | 1 関数=1 機能、30 行以内が目安 | parse_args(), execute_add(), save_tasks() など |
| エラーハンドリング | すべての外部呼び出しで戻り値チェック | if (fopen(... ) == NULL) { perror("fopen"); return -1; } |
| 静的解析 | -Wall -Wextra -Wpedantic を必ず有効化 |
CI に gcc -Wall -Wextra -Werror … を組み込む |
| テスト | ユニットテストは assert.h または CMocka で実装 |
assert(factorial(5) == 120); |
リファクタリング例(Day 7 の main.c)
| Before (200 行超) | After (≈70 行) |
|---|---|
| コマンド解析・ロジックが混在し、可読性が低い | parse_args(), run_command() に分割し、各機能は 20 行以内に収めた |
リファクタリング後の抜粋
|
1 2 3 4 5 |
static void parse_args(int argc, char *argv[], CmdInfo *info); static int run_add(const char *desc); static int run_list(void); static int run_done(int id); |
結果:テストが関数単位で書け、変更時の影響範囲が限定的になる。
FAQ とトラブルシューティング
Q1. 「cl が見つかりません」と表示される
A: 環境変数 PATH に Visual Studio の Developer Command Prompt が追加されていない可能性があります。
- 解決策:スタートメニュー → Visual Studio 2022 → x64 Native Tools Command Prompt for VS 2022 を起動し、そこでビルドしてください。
Q2. gcc コンパイル時に「undefined reference to main」エラーが出る
A: ソースファイル名が正しく指定されていないか、main 関数のシグネチャが int main(void) でない可能性があります。
Q3. VS Code のデバッグが起動しない(launch.json が自動生成されない)
A: C/C++ 拡張機能が正しくインストールされていない、または tasks.json が未作成です。
- 対策:コマンドパレット (Ctrl+Shift+P) → C/C++: Edit Configurations (UI) → 必要項目を入力して保存すると自動生成されます。
Q4. Git の認証で remote: Repository not found. と出る
A: HTTPS 認証情報が古い、またはリポジトリ URL が間違っています。
- 対策:git remote set-url origin https://github.com/yourname/c-language-7days.git で正しい URL を設定し、キャッシュされた認証情報を git credential-manager uninstall 後に再入力してください。
まとめ
- Visual Studio 2022 + VS Code が Windows・macOS・Linux のすべてで快適に C 言語開発ができる標準環境です。
- 7 日間ロードマップ に沿ってハンズオンをこなせば、実務レベルの小規模プロジェクト(TODO CLI)まで完成させられます。
- コード品質 は「コメント・命名・関数分割」の三本柱で意識し、ビルド時は必ず警告を 0 に保ちましょう。
- 学習ログの可視化(Markdown チェックリスト + Pull Request)により、自己管理と外部フィードバックがスムーズになります。
さあ、環境構築から始めて、7 日後には自信を持って C 言語で実務タスクに挑戦できるようになりましょう! 🚀