C言語を学習する際や軽量な開発を行う際に、適切なエディタ選びは重要です。Sublime Textは、軽量で高速、かつ高いカスタマイズ性を持つテキストエディタとして、多くの開発者に愛用されています。
しかし、Sublime TextはC言語専用のIDEではないため、そのままではコンパイルやデバッグ機能が備わっていません。
この記事では、Sublime TextでC言語開発を快適に行うための環境構築から実践的な設定まで、初心者にもわかりやすく解説します。
Sublime TextでC言語開発を行うメリット

軽量で高速な動作
パフォーマンスの優位性
- 起動時間が非常に短い(通常1-2秒)
- 大きなファイルでもスムーズな編集が可能
- メモリ使用量が少ない(100-200MB程度)
- 古いPCでも快適に動作
比較例
起動時間比較(目安)
- Sublime Text: 1-2秒
- VSCode: 3-5秒
- Code::Blocks: 5-10秒
- Visual Studio: 10-30秒
シンプルで洗練されたインターフェース
特徴
- 無駄な機能やボタンが少ない
- コードに集中できる設計
- カスタマイズ性が高い
- ミニマルなUIで気が散らない
クロスプラットフォーム対応
対応OS
- Windows(7以降)
- macOS(10.7以降)
- Linux(Ubuntu、CentOS等)
同じ設定ファイルを各OS間で共有できるため、複数環境での開発が容易です。
C言語開発環境の準備
コンパイラの必要性
Sublime Textはテキストエディタであり、C言語のコンパイル機能は内蔵されていません。そのため、別途Cコンパイラのインストールが必要です。
Windows環境での設定
MinGW-w64のインストール
手順1: MinGW-w64の取得
- MinGW-w64公式サイトにアクセス
- 「Downloads」セクションからインストーラーをダウンロード
- 推奨設定でインストール実行
手順2: 環境変数の設定
# コマンドプロンプトで確認
gcc --version
# パスが通っていない場合は環境変数PATHに追加
# 例: C:\mingw64\bin
手順3: 動作確認
// test.c
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
gcc test.c -o test.exe
test.exe
TDM-GCC(代替選択肢)
特徴
- インストールが簡単
- 環境変数の設定が自動
- Windowsに最適化済み
インストール手順
- TDM-GCC公式サイトからダウンロード
- インストーラーを実行
- デフォルト設定でインストール
macOS環境での設定
Xcode Command Line Toolsのインストール
手順1: コマンドラインツールのインストール
# ターミナルで実行
xcode-select --install
手順2: インストール確認
# GCC(実際はClang)のバージョン確認
gcc --version
# 出力例
# Apple clang version 12.0.0 (clang-1200.0.32.29)
手順3: 動作テスト
# test.cをコンパイル
gcc test.c -o test
# 実行
./test
Homebrew経由でのGCCインストール(オプション)
# Homebrewのインストール(未インストールの場合)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# GCCのインストール
brew install gcc
# インストール確認
gcc-11 --version # バージョン番号は変動
Linux環境での設定
Ubuntu/Debian系
build-essentialパッケージのインストール
# パッケージ情報の更新
sudo apt update
# 開発ツールのインストール
sudo apt install build-essential
# インストール確認
gcc --version
make --version
CentOS/RHEL系
Development Toolsのインストール
# CentOS 7以前
sudo yum groupinstall "Development Tools"
# CentOS 8以降/RHEL 8以降
sudo dnf groupinstall "Development Tools"
# インストール確認
gcc --version
Arch Linux
# base-develグループのインストール
sudo pacman -S base-devel
# インストール確認
gcc --version
Sublime Textのビルドシステム設定

基本的なビルドシステムの作成
Windows用ビルドシステム
設定手順
- Sublime Textで
Tools > Build System > New Build System
を選択 - 以下の設定を入力
{
"cmd": ["gcc", "$file", "-o", "${file_path}/${file_base_name}.exe"],
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c",
"variants": [
{
"name": "Run",
"cmd": ["gcc", "$file", "-o", "${file_path}/${file_base_name}.exe", "&&", "${file_path}/${file_base_name}.exe"],
"shell": true
},
{
"name": "Debug",
"cmd": ["gcc", "-g", "$file", "-o", "${file_path}/${file_base_name}.exe"],
"shell": true
}
]
}
C_Windows.sublime-build
として保存
macOS/Linux用ビルドシステム
{
"cmd": ["gcc", "$file", "-o", "${file_path}/${file_base_name}"],
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c",
"variants": [
{
"name": "Run",
"cmd": ["bash", "-c", "gcc '$file' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
},
{
"name": "Debug",
"cmd": ["gcc", "-g", "$file", "-o", "${file_path}/${file_base_name}"]
},
{
"name": "Release",
"cmd": ["gcc", "-O2", "$file", "-o", "${file_path}/${file_base_name}"]
}
]
}
高度なビルドシステム設定
複数ファイルプロジェクト対応
{
"cmd": ["make"],
"working_dir": "${project_path:${folder}}",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"selector": "source.c",
"variants": [
{
"name": "Clean",
"cmd": ["make", "clean"]
},
{
"name": "Install",
"cmd": ["make", "install"]
},
{
"name": "Debug Build",
"cmd": ["make", "DEBUG=1"]
}
]
}
Makefileの例
# Makefile
CC = gcc
CFLAGS = -Wall -Wextra -std=c99
DEBUG_FLAGS = -g -DDEBUG
RELEASE_FLAGS = -O2 -DNDEBUG
SRCDIR = src
OBJDIR = obj
BINDIR = bin
SOURCES = $(wildcard $(SRCDIR)/*.c)
OBJECTS = $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
TARGET = $(BINDIR)/myprogram
.PHONY: all clean debug release
all: $(TARGET)
debug: CFLAGS += $(DEBUG_FLAGS)
debug: $(TARGET)
release: CFLAGS += $(RELEASE_FLAGS)
release: $(TARGET)
$(TARGET): $(OBJECTS) | $(BINDIR)
$(CC) $(OBJECTS) -o $@
$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
$(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR):
mkdir -p $(OBJDIR)
$(BINDIR):
mkdir -p $(BINDIR)
clean:
rm -rf $(OBJDIR) $(BINDIR)
install: $(TARGET)
cp $(TARGET) /usr/local/bin/
必須プラグインとカスタマイズ
Package Controlのインストール
インストール手順
Ctrl+Shift+P
(macOSではCmd+Shift+P
)でコマンドパレットを開くInstall Package Control
を選択- インストール完了まで待機
C言語開発向けプラグイン
1. LSP(Language Server Protocol)
インストール
1. Package Control > Install Package
2. "LSP"を検索してインストール
3. "LSP-clangd"もインストール
設定(Preferences > Package Settings > LSP > Settings)
{
"clients": {
"clangd": {
"enabled": true,
"command": ["clangd"],
"selector": "source.c | source.c++",
"initializationOptions": {
"clangdFileStatus": true,
"usePlaceholders": true,
"completeUnimported": true,
"semanticHighlighting": true
}
}
}
}
機能
- リアルタイムシンタックスチェック
- インテリジェントなコード補完
- 関数やマクロの定義ジャンプ
- リファクタリング支援
2. SublimeClang(代替選択肢)
インストールと設定
// SublimeClang設定例
{
"include_dirs": [
"/usr/include",
"/usr/local/include",
"${project_path}/include"
],
"options": [
"-Wall",
"-std=c99"
]
}
3. BracketHighlighter
機能
- 対応する括弧のハイライト
- ネストレベルの視覚化
- 括弧の不整合検出
カスタム設定
{
"bracket_styles": {
"default": {
"icon": "dot",
"color": "brackethighlighter.default",
"style": "highlight"
}
}
}
4. All Autocomplete
機能
- 開いているすべてのファイルから補完候補を生成
- プロジェクト全体の変数・関数名補完
エディタ設定のカスタマイズ
Preferences.sublime-settings
{
// 基本設定
"font_face": "Consolas",
"font_size": 12,
"tab_size": 4,
"translate_tabs_to_spaces": true,
"word_wrap": false,
// C言語向け設定
"rulers": [80, 120],
"show_line_endings": true,
"trim_trailing_white_space_on_save": true,
"ensure_newline_at_eof_on_save": true,
// 見た目の設定
"color_scheme": "Monokai.sublime-color-scheme",
"theme": "Default.sublime-theme",
"highlight_line": true,
"line_numbers": true,
"gutter": true,
// 編集支援
"auto_complete": true,
"auto_complete_delay": 50,
"auto_complete_selector": "source, text",
"auto_match_enabled": true,
// ファイル管理
"hot_exit": false,
"remember_open_files": true
}
C言語専用設定(C.sublime-settings)
{
"extensions": ["c", "h"],
"tab_size": 4,
"translate_tabs_to_spaces": true,
"rulers": [80],
"word_separators": "./\\()\"'-:,.;<>~!@#$%^&*|+=[]{}`~?",
// インデント設定
"auto_indent": true,
"smart_indent": true,
"indent_to_bracket": true,
// C特有の設定
"bracket_highlighter.ignore": false,
"bracket_highlighter.high_visibility": true
}
実践的な開発ワークフロー

プロジェクト管理
Sublime Textプロジェクトファイルの作成
myproject.sublime-project
{
"folders": [
{
"path": ".",
"folder_exclude_patterns": ["obj", "bin", ".git"],
"file_exclude_patterns": ["*.o", "*.exe", "*.out"]
}
],
"settings": {
"tab_size": 4,
"translate_tabs_to_spaces": true
},
"build_systems": [
{
"name": "Project Build",
"cmd": ["make", "-j4"],
"working_dir": "${project_path}"
}
]
}
デバッグワークフロー
GDBとの連携設定
GDB用ビルドシステム
{
"name": "Debug with GDB",
"cmd": ["gcc", "-g", "-O0", "$file", "-o", "${file_base_name}.debug"],
"working_dir": "${file_path}",
"variants": [
{
"name": "Run GDB",
"cmd": ["gdb", "${file_base_name}.debug"],
"shell": true
}
]
}
デバッグ用マクロとスニペット
printf デバッグ用スニペット
<snippet>
<content><![CDATA[
printf("DEBUG: %s:%d - ${1:message}\n", __FILE__, __LINE__);
]]></content>
<tabTrigger>debugp</tabTrigger>
<scope>source.c</scope>
<description>Debug printf</description>
</snippet>
コードスタイルと品質管理
.clang-formatの設定
# .clang-format
BasedOnStyle: GNU
IndentWidth: 4
TabWidth: 4
UseTab: Never
ColumnLimit: 80
BreakBeforeBraces: Allman
SpaceAfterCStyleCast: true
AlignConsecutiveDeclarations: true
AlignConsecutiveAssignments: true
静的解析の統合
cppcheck用ビルドシステム
{
"name": "Static Analysis",
"cmd": ["cppcheck", "--enable=all", "--inconclusive", "$file"],
"working_dir": "${file_path}",
"selector": "source.c"
}
トラブルシューティング
よくあるエラーと解決方法
「gcc: command not found」エラー
原因と解決策
Windows
# パスの確認
echo %PATH%
# MinGWのパスを追加(例)
set PATH=%PATH%;C:\mingw64\bin
# 永続的な設定は環境変数から
macOS
# Xcode Command Line Toolsの再インストール
sudo xcode-select --reset
xcode-select --install
# パスの確認
echo $PATH
which gcc
Linux
# パッケージの確認
dpkg -l | grep gcc
# 再インストール(Ubuntu)
sudo apt update
sudo apt install --reinstall build-essential
コンパイルエラーの対処
よくあるエラーパターン
// エラー例1: ヘッダーファイル未include
#include <stdio.h> // 追加が必要
int main() {
printf("Hello\n"); // stdio.h が必要
return 0;
}
// エラー例2: 変数の未宣言
int main() {
int i; // 宣言を追加
for (i = 0; i < 10; i++) {
printf("%d\n", i);
}
return 0;
}
// エラー例3: 関数プロトタイプの不備
int add(int a, int b); // プロトタイプ宣言
int main() {
int result = add(5, 3);
printf("Result: %d\n", result);
return 0;
}
int add(int a, int b) { // 関数定義
return a + b;
}
ビルドシステムのトラブル
ビルドが実行されない場合
- ファイル保存の確認
Ctrl+S で保存後にビルド実行
- ビルドシステムの選択確認
Tools > Build System > C_Windows(作成したシステム名)
- 作業ディレクトリの確認
{ "working_dir": "${file_path}", // 重要 "cmd": ["gcc", "$file", "-o", "${file_base_name}"] }
パフォーマンス問題の解決
動作が重い場合の対策
大きなファイルでの最適化
{
// ファイルサイズ制限
"index_files": false,
"binary_file_patterns": ["*.jpg", "*.jpeg", "*.png", "*.gif", "*.o", "*.exe"],
// フォルダ除外
"folder_exclude_patterns": [".git", "obj", "build", "node_modules"]
}
プラグインの最適化
{
// 重いプラグインの無効化
"ignored_packages": ["Vintage", "SublimeCodeIntel"]
}
実践プロジェクト例

簡単な計算機プログラム
プロジェクト構造
calculator/
├── src/
│ ├── main.c
│ ├── calculator.c
│ └── calculator.h
├── include/
├── obj/
├── bin/
├── Makefile
└── calculator.sublime-project
ソースコード例
calculator.h
#ifndef CALCULATOR_H
#define CALCULATOR_H
// 関数プロトタイプ
double add(double a, double b);
double subtract(double a, double b);
double multiply(double a, double b);
double divide(double a, double b);
// エラーコード
typedef enum {
CALC_SUCCESS = 0,
CALC_ERROR_DIVISION_BY_ZERO,
CALC_ERROR_INVALID_INPUT
} calc_error_t;
#endif // CALCULATOR_H
calculator.c
#include "calculator.h"
#include <math.h>
double add(double a, double b) {
return a + b;
}
double subtract(double a, double b) {
return a - b;
}
double multiply(double a, double b) {
return a * b;
}
double divide(double a, double b) {
if (fabs(b) < 1e-9) {
return NAN; // ゼロ除算エラー
}
return a / b;
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "calculator.h"
int main() {
double num1, num2, result;
char operator;
printf("簡単な電卓プログラム\n");
printf("計算式を入力してください (例: 5 + 3): ");
if (scanf("%lf %c %lf", &num1, &operator, &num2) != 3) {
fprintf(stderr, "エラー: 入力形式が正しくありません\n");
return EXIT_FAILURE;
}
switch (operator) {
case '+':
result = add(num1, num2);
break;
case '-':
result = subtract(num1, num2);
break;
case '*':
result = multiply(num1, num2);
break;
case '/':
result = divide(num1, num2);
if (isnan(result)) {
fprintf(stderr, "エラー: ゼロで除算することはできません\n");
return EXIT_FAILURE;
}
break;
default:
fprintf(stderr, "エラー: 未対応の演算子です: %c\n", operator);
return EXIT_FAILURE;
}
printf("結果: %.2f %c %.2f = %.2f\n", num1, operator, num2, result);
return EXIT_SUCCESS;
}
Makefile
# プロジェクト設定
PROJECT_NAME = calculator
CC = gcc
CFLAGS = -Wall -Wextra -std=c99 -pedantic
DEBUG_FLAGS = -g -DDEBUG -O0
RELEASE_FLAGS = -O2 -DNDEBUG
# ディレクトリ設定
SRCDIR = src
INCDIR = include
OBJDIR = obj
BINDIR = bin
# ファイル設定
SOURCES = $(wildcard $(SRCDIR)/*.c)
OBJECTS = $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
TARGET = $(BINDIR)/$(PROJECT_NAME)
# デフォルトターゲット
.PHONY: all clean debug release install
all: release
# リリースビルド
release: CFLAGS += $(RELEASE_FLAGS)
release: $(TARGET)
# デバッグビルド
debug: CFLAGS += $(DEBUG_FLAGS)
debug: $(TARGET)
# メインターゲット
$(TARGET): $(OBJECTS) | $(BINDIR)
$(CC) $(OBJECTS) -o $@ -lm
# オブジェクトファイル生成
$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
$(CC) $(CFLAGS) -I$(INCDIR) -c $< -o $@
# ディレクトリ作成
$(OBJDIR):
mkdir -p $(OBJDIR)
$(BINDIR):
mkdir -p $(BINDIR)
# クリーンアップ
clean:
rm -rf $(OBJDIR) $(BINDIR)
# インストール(オプション)
install: $(TARGET)
sudo cp $(TARGET) /usr/local/bin/
# 実行用ターゲット
run: $(TARGET)
$(TARGET)
# テスト用ターゲット
test: debug
@echo "5 + 3" | $(TARGET)
@echo "10 - 4" | $(TARGET)
@echo "6 * 7" | $(TARGET)
@echo "15 / 3" | $(TARGET)
上級者向けテクニック
マクロとスニペットの活用
カスタムスニペット
関数テンプレート
<snippet>
<content><![CDATA[
${1:return_type} ${2:function_name}(${3:parameters}) {
${4:// TODO: 実装}
${0}
}
]]></content>
<tabTrigger>func</tabTrigger>
<scope>source.c</scope>
<description>Function template</description>
</snippet>
エラーハンドリングテンプレート
<snippet>
<content><![CDATA[
if (${1:condition}) {
fprintf(stderr, "Error: ${2:error message}\\n");
${3:return EXIT_FAILURE;}
}
]]></content>
<tabTrigger>errchk</tabTrigger>
<scope>source.c</scope>
<description>Error checking template</description>
</snippet>
キーバインドのカスタマイズ
Default (Windows).sublime-keymap
[
{
"keys": ["f5"],
"command": "build",
"context": [{"key": "selector", "operator": "equal", "operand": "source.c"}]
},
{
"keys": ["ctrl+f5"],
"command": "build",
"args": {"variant": "Run"},
"context": [{"key": "selector", "operator": "equal", "operand": "source.c"}]
},
{
"keys": ["f9"],
"command": "build",
"args": {"variant": "Debug"},
"context": [{"key": "selector", "operator": "equal", "operand": "source.c"}]
}
]
統合開発環境的な使用
サイドバーの活用
プロジェクト設定での除外パターン
{
"folders": [
{
"path": ".",
"folder_exclude_patterns": [
".git", "obj", "bin", "build",
"*.dSYM", "__pycache__"
],
"file_exclude_patterns": [
"*.o", "*.obj", "*.exe", "*.out",
"*.dll", "*.so", "*.dylib",
".DS_Store", "Thumbs.db"
]
}
]
}
マルチペイン編集
レイアウト設定
// View > Layout > Columns: 2
{
"cols": [0.0, 0.5, 1.0],
"rows": [0.0, 1.0],
"cells": [[0, 0, 1, 1], [1, 0, 2, 1]]
}
まとめ
Sublime TextでC言語開発を行うための包括的な環境構築とカスタマイズ方法を解説しました。
重要なポイント
環境構築の基本
- 適切なコンパイラの導入(GCC、Clang)
- ビルドシステムの設定とカスタマイズ
- OSごとの最適化設定
開発効率の向上
- LSPやSublimeClangによるインテリジェントな補完
- カスタムスニペットとマクロの活用
- プロジェクト管理とワークフロー最適化
実践的な活用
- デバッグワークフローの構築
- 静的解析ツールの統合
- 複数ファイルプロジェクトの管理
パフォーマンス最適化とベストプラクティス

メモリ使用量の最適化
大規模プロジェクトでの設定
// 大きなプロジェクト用設定
{
"index_files": false,
"index_exclude_patterns": ["*.log", "*.tmp", "obj/*", "build/*"],
"binary_file_patterns": [
"*.jpg", "*.jpeg", "*.png", "*.gif", "*.ttf", "*.tga", "*.dds",
"*.ico", "*.eot", "*.pdf", "*.swf", "*.jar", "*.zip", "*.o", "*.exe"
],
"file_exclude_patterns": [
"*.pyc", "*.pyo", "*.exe", "*.dll", "*.obj", "*.o", "*.a", "*.lib",
"*.so", "*.dylib", "*.ncb", "*.sdf", "*.suo", "*.pdb", "*.idb"
]
}
メモリ監視とプロファイリング
# Sublime Text Plugin: memory_monitor.py
import sublime
import sublime_plugin
import psutil
import os
class MemoryMonitorCommand(sublime_plugin.TextCommand):
def run(self, edit):
process = psutil.Process(os.getpid())
memory_info = process.memory_info()
status = "Memory: {:.1f}MB RSS, {:.1f}MB VMS".format(
memory_info.rss / 1024 / 1024,
memory_info.vms / 1024 / 1024
)
sublime.status_message(status)
print(status)
ワークスペース管理
プロジェクトテンプレートの作成
C Project Template
{
"folders": [
{
"path": ".",
"folder_exclude_patterns": ["build", "obj", ".git"],
"file_exclude_patterns": ["*.o", "*.exe", "*.out", "core"]
}
],
"settings": {
"tab_size": 4,
"translate_tabs_to_spaces": true,
"rulers": [80, 120],
"word_wrap": false,
"default_encoding": "UTF-8",
"default_line_ending": "unix"
},
"build_systems": [
{
"name": "Make Project",
"cmd": ["make", "-j", "4"],
"working_dir": "${project_path}",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$"
},
{
"name": "Clean Project",
"cmd": ["make", "clean"],
"working_dir": "${project_path}"
},
{
"name": "Install Project",
"cmd": ["make", "install"],
"working_dir": "${project_path}"
}
]
}
複数プロジェクトの管理
ProjectManager設定
{
"projects_path": "~/Documents/SublimeProjects",
"use_project_folder_name": true,
"show_recent_projects_first": true,
"clear_recent_on_delete": true,
"auto_render_fields": true
}
バージョン管理との統合
Git統合の設定
GitGutter設定
{
"show_markers_on_untracked_file": true,
"enable_hover_diff_popup": true,
"diff_popup_default_mode": "diff",
"theme": "Default.gitgutter-theme"
}
コミット前チェック用スクリプト
pre-commit hook例
#!/bin/bash
# .git/hooks/pre-commit
# C言語ファイルのスタイルチェック
for file in $(git diff --cached --name-only --diff-filter=ACM | grep '\.[ch]); do
# clang-formatでフォーマットチェック
if ! clang-format --dry-run --Werror "$file" > /dev/null 2>&1; then
echo "Error: $file is not properly formatted"
echo "Run: clang-format -i $file"
exit 1
fi
# cppcheckで静的解析
if ! cppcheck --error-exitcode=1 --quiet "$file" > /dev/null 2>&1; then
echo "Error: cppcheck found issues in $file"
exit 1
fi
done
echo "All checks passed"
自動化とスクリプト
タスクランナーの設定
tasks.json (VSCode互換)
{
"version": "2.0.0",
"tasks": [
{
"label": "build-debug",
"type": "shell",
"command": "gcc",
"args": [
"-g",
"-Wall",
"-Wextra",
"${file}",
"-o",
"${fileBasenameNoExtension}_debug"
],
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared"
},
"problemMatcher": "$gcc"
},
{
"label": "run-debug",
"type": "shell",
"command": "./${fileBasenameNoExtension}_debug",
"dependsOn": "build-debug",
"group": "test"
}
]
}
Sublime Textでのタスク実行
Task Runner Plugin
import sublime
import sublime_plugin
import subprocess
import json
import os
class RunTaskCommand(sublime_plugin.WindowCommand):
def run(self):
project_data = self.window.project_data()
if not project_data:
sublime.error_message("No project opened")
return
tasks_file = os.path.join(
self.window.folders()[0],
'.vscode',
'tasks.json'
)
if not os.path.exists(tasks_file):
sublime.error_message("No tasks.json found")
return
with open(tasks_file, 'r') as f:
tasks_data = json.load(f)
task_names = [task['label'] for task in tasks_data['tasks']]
def on_select(index):
if index >= 0:
self.run_task(tasks_data['tasks'][index])
self.window.show_quick_panel(task_names, on_select)
def run_task(self, task):
cmd = [task['command']] + task.get('args', [])
cwd = self.window.folders()[0] if self.window.folders() else None
self.window.run_command('exec', {
'cmd': cmd,
'working_dir': cwd
})
デバッグ環境の高度化
LLDB/GDB統合
LLDB設定ファイル (.lldbinit)
# .lldbinit
settings set target.x86-disassembly-flavor intel
settings set target.load-script-from-symbol-file true
# カスタムコマンド定義
command script import ~/lldb_scripts/pretty_printers.py
# ブレークポイント設定の簡素化
command alias bpl breakpoint list
command alias bpc breakpoint clear
command alias bpe breakpoint enable
command alias bpd breakpoint disable
GDB設定ファイル (.gdbinit)
# .gdbinit
set confirm off
set verbose off
set history save on
set history filename ~/.gdb_history
# 表示設定
set print pretty on
set print array on
set print array-indexes on
# Intel記法での逆アセンブル
set disassembly-flavor intel
# カスタムコマンド
define cls
shell clear
end
define hex
printf "0x%x\n", $arg0
end
デバッガ統合用プラグイン
# sublime_debugger.py
import sublime
import sublime_plugin
import subprocess
import threading
class StartDebuggerCommand(sublime_plugin.TextCommand):
def run(self, edit):
file_path = self.view.file_name()
if not file_path or not file_path.endswith('.c'):
sublime.error_message("Not a C file")
return
base_name = file_path[:-2] # .c を除去
executable = base_name + "_debug"
# デバッグビルド
cmd = ['gcc', '-g', '-O0', file_path, '-o', executable]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
sublime.error_message(f"Compile error: {result.stderr}")
return
# GDB起動
gdb_cmd = ['gdb', executable]
subprocess.Popen(gdb_cmd, cwd=os.path.dirname(file_path))
sublime.status_message("Debugger started")
class ToggleBreakpointCommand(sublime_plugin.TextCommand):
def run(self, edit):
line_num = self.view.rowcol(self.view.sel()[0].begin())[0] + 1
# ブレークポイントマーカーの管理
breakpoints = self.view.get_regions('breakpoints')
current_line = self.view.line(self.view.sel()[0])
# 既存のブレークポイントがあるかチェック
existing = [bp for bp in breakpoints if bp.intersects(current_line)]
if existing:
# ブレークポイント削除
breakpoints = [bp for bp in breakpoints if not bp.intersects(current_line)]
self.view.add_regions('breakpoints', breakpoints,
'markup.deleted', 'circle')
sublime.status_message(f"Breakpoint removed at line {line_num}")
else:
# ブレークポイント追加
breakpoints.append(current_line)
self.view.add_regions('breakpoints', breakpoints,
'markup.inserted', 'circle')
sublime.status_message(f"Breakpoint set at line {line_num}")
コード品質管理
静的解析の自動化
Makefile での品質チェック統合
# 品質チェック用ターゲット
.PHONY: check lint format
# 総合チェック
check: lint cppcheck valgrind
# コードフォーマット
format:
find $(SRCDIR) -name "*.c" -o -name "*.h" | xargs clang-format -i
# リント チェック
lint:
@echo "Running clang-tidy..."
find $(SRCDIR) -name "*.c" | xargs clang-tidy
# 静的解析
cppcheck:
@echo "Running cppcheck..."
cppcheck --enable=all --inconclusive --std=c99 $(SRCDIR)/
# メモリリーク検出
valgrind: $(TARGET)
@echo "Running valgrind..."
valgrind --leak-check=full --show-leak-kinds=all $(TARGET)
# カバレッジ測定
coverage:
gcc $(CFLAGS) --coverage $(SOURCES) -o $(TARGET)_coverage
./$(TARGET)_coverage
gcov $(SOURCES)
lcov -c -d . -o coverage.info
genhtml coverage.info -o coverage_html
コードメトリクス測定
複雑度測定スクリプト
#!/usr/bin/env python3
# complexity_checker.py
import os
import re
import sys
from collections import defaultdict
def calculate_cyclomatic_complexity(file_path):
"""McCabe循環的複雑度を計算"""
with open(file_path, 'r') as f:
content = f.read()
# コメントと文字列を除去
content = re.sub(r'//.*', '', content)
content = re.sub(r'/\*.*?\*/', '', content, flags=re.DOTALL)
content = re.sub(r'"[^"]*"', '', content)
# 決定点をカウント
decision_points = [
r'\bif\b', r'\belse\s+if\b', r'\bwhile\b', r'\bfor\b',
r'\bdo\b', r'\bswitch\b', r'\bcase\b', r'\bdefault\b',
r'\?', r'&&', r'\|\|'
]
complexity = 1 # ベースライン
for pattern in decision_points:
complexity += len(re.findall(pattern, content))
return complexity
def analyze_project(project_dir):
"""プロジェクト全体を解析"""
results = defaultdict(list)
for root, dirs, files in os.walk(project_dir):
for file in files:
if file.endswith('.c'):
file_path = os.path.join(root, file)
complexity = calculate_cyclomatic_complexity(file_path)
results[complexity].append(file_path)
return results
if __name__ == '__main__':
project_dir = sys.argv[1] if len(sys.argv) > 1 else '.'
results = analyze_project(project_dir)
print("Cyclomatic Complexity Report")
print("=" * 50)
for complexity in sorted(results.keys(), reverse=True):
if complexity > 10: # 高複雑度のファイルのみ表示
print(f"Complexity {complexity}:")
for file_path in results[complexity]:
print(f" {file_path}")
プロダクション環境への配布
リリースビルドの自動化
release.mk
# リリース専用Makefile
include Makefile
RELEASE_DIR = release
VERSION = $(shell git describe --tags --abbrev=0 2>/dev/null || echo "v1.0.0")
ARCHIVE_NAME = $(PROJECT_NAME)-$(VERSION)
.PHONY: release package clean-release
release: clean
@echo "Building release version $(VERSION)..."
$(MAKE) CFLAGS="$(CFLAGS) $(RELEASE_FLAGS)" all
package: release
@echo "Creating release package..."
mkdir -p $(RELEASE_DIR)
cp $(TARGET) $(RELEASE_DIR)/
cp README.md LICENSE $(RELEASE_DIR)/ 2>/dev/null || true
# アーカイブ作成
tar -czf $(ARCHIVE_NAME).tar.gz -C $(RELEASE_DIR) .
zip -r $(ARCHIVE_NAME).zip $(RELEASE_DIR)/*
@echo "Release package created: $(ARCHIVE_NAME).tar.gz, $(ARCHIVE_NAME).zip"
clean-release:
rm -rf $(RELEASE_DIR)
rm -f $(PROJECT_NAME)-*.tar.gz $(PROJECT_NAME)-*.zip
# インストーラー作成(Linux/Unix)
install-release: package
sudo mkdir -p /usr/local/bin
sudo cp $(RELEASE_DIR)/$(PROJECT_NAME) /usr/local/bin/
sudo chmod +x /usr/local/bin/$(PROJECT_NAME)
@echo "Installed to /usr/local/bin/$(PROJECT_NAME)"
クロスコンパイル設定
cross-compile.mk
# クロスコンパイル設定
# Windows (MinGW)
windows:
$(MAKE) CC=x86_64-w64-mingw32-gcc \
CFLAGS="$(CFLAGS) -static" \
TARGET="$(BINDIR)/$(PROJECT_NAME).exe"
# ARM Linux
arm-linux:
$(MAKE) CC=arm-linux-gnueabihf-gcc \
CFLAGS="$(CFLAGS) -static" \
TARGET="$(BINDIR)/$(PROJECT_NAME)-arm"
# macOS (クロスコンパイル)
macos:
$(MAKE) CC=o64-clang \
CFLAGS="$(CFLAGS)" \
TARGET="$(BINDIR)/$(PROJECT_NAME)-macos"
# 全プラットフォーム
all-platforms: windows arm-linux macos
@echo "Built for all platforms"
これでSublime TextでのC言語開発環境の完全なガイドが完成しました。基本的な環境構築から、高度なプロダクション環境への配布まで、実際の開発現場で使える包括的な内容になっています。
コメント