[C言語] includeできる主なヘッダファイル一覧

C言語では、プログラムの機能を拡張するために様々なヘッダファイルを#includeディレクティブを用いてインクルードします。

主なヘッダファイルには、標準入出力を扱うstdio.h、文字列操作を行うstring.h、メモリ管理を行うstdlib.h、数学関数を提供するmath.h、時間操作を行うtime.hなどがあります。

これらのヘッダファイルを利用することで、C言語プログラムにおいて基本的な機能を簡単に実装することが可能です。します。

この記事でわかること
  • C言語のヘッダファイルの役割と重要性
  • 標準ヘッダファイルの一覧とその機能
  • 入出力、文字列操作、数学関連のヘッダファイルの使い方
  • 特殊用途のヘッダファイルの概要と使用例

目次から探す

C言語のヘッダファイルとは

C言語のヘッダファイルは、プログラムのソースコードにおいて、関数や変数、型定義などの宣言をまとめたファイルです。

これにより、プログラムの可読性や再利用性が向上します。

ヘッダファイルは通常、.hという拡張子を持ち、#includeディレクティブを用いてソースファイルに取り込まれます。

これにより、プログラムの異なる部分で同じ宣言を共有することができ、コードの一貫性を保つことができます。

標準ライブラリのヘッダファイルには、入出力処理や文字列操作、数学計算など、さまざまな機能が含まれており、プログラマはこれらを利用することで効率的にプログラムを開発することが可能です。

標準ヘッダファイル一覧

スクロールできます
ヘッダファイル名主な機能説明
stdio.h標準入出力関数
stdlib.h汎用的なユーティリティ関数
string.h文字列操作関数
ctype.h文字の分類と変換
math.h数学関数
time.h時間管理関数
errno.hエラー番号の定義
assert.hアサーションによるエラーチェック
fcntl.hファイル制御
unistd.hPOSIXオペレーティングシステムAPI
socket.hソケット通信
netinet/in.hインターネットプロトコル定義
pthread.hPOSIXスレッド
semaphore.hセマフォ操作

この表は、C言語でよく使用される標準ヘッダファイルとその主な機能をまとめたものです。

各ヘッダファイルは、特定の機能を提供し、プログラムの開発をサポートします。

入出力関連のヘッダファイル

C言語における入出力関連のヘッダファイルは、データの読み書きやメモリ管理など、プログラムの基本的な操作をサポートします。

以下に、代表的なヘッダファイルを紹介します。

stdio.h

stdio.hは、標準入出力を扱うための関数を提供するヘッダファイルです。

ファイル操作やコンソールへの入出力を行うための関数が含まれています。

関数名機能
printf画面に出力する
scanf入力を受け取る
fopenファイルを開く
fcloseファイルを閉じる
freadファイルからデータを読み込む
fwriteファイルにデータを書き込む
#include <stdio.h>
int main() {
    // 画面に文字列を出力
    printf("こんにちは、世界!\n");
    // ユーザーからの入力を受け取る
    int number;
    printf("数字を入力してください: ");
    scanf("%d", &number);
    printf("入力された数字は: %d\n", number);
    return 0;
}
こんにちは、世界!
数字を入力してください: 5
入力された数字は: 5

このサンプルコードでは、printfを使って画面に文字列を出力し、scanfを使ってユーザーからの入力を受け取っています。

stdlib.h

stdlib.hは、標準ライブラリのユーティリティ関数を提供するヘッダファイルです。

メモリ管理やプログラムの終了、乱数生成などの機能が含まれています。

関数名機能
mallocメモリを動的に確保する
free確保したメモリを解放する
exitプログラムを終了する
rand乱数を生成する
atoi文字列を整数に変換する
#include <stdio.h>
#include <stdlib.h>
int main() {
    // メモリを動的に確保
    int *array = (int *)malloc(5 * sizeof(int));
    if (array == NULL) {
        printf("メモリの確保に失敗しました。\n");
        return 1;
    }
    // 乱数を生成して配列に格納
    for (int i = 0; i < 5; i++) {
        array[i] = rand() % 100; // 0から99の乱数
        printf("array[%d] = %d\n", i, array[i]);
    }
    // メモリを解放
    free(array);
    return 0;
}
array[0] = 42
array[1] = 17
array[2] = 93
array[3] = 58
array[4] = 76

このサンプルコードでは、mallocを使ってメモリを動的に確保し、randを使って乱数を生成して配列に格納しています。

最後に、freeを使って確保したメモリを解放しています。

文字列操作関連のヘッダファイル

C言語では、文字列操作を効率的に行うためのヘッダファイルが用意されています。

これらのヘッダファイルを利用することで、文字列の操作や文字の分類を簡単に行うことができます。

string.h

string.hは、文字列操作を行うための関数を提供するヘッダファイルです。

文字列のコピー、結合、比較、長さの取得など、さまざまな操作をサポートしています。

関数名機能
strcpy文字列をコピーする
strcat文字列を結合する
strcmp文字列を比較する
strlen文字列の長さを取得する
strchr文字列中の特定の文字を検索する
#include <stdio.h>
#include <string.h>
int main() {
    char str1[20] = "Hello";
    char str2[20] = "World";
    // 文字列を結合
    strcat(str1, str2);
    printf("結合された文字列: %s\n", str1);
    // 文字列の長さを取得
    printf("文字列の長さ: %lu\n", strlen(str1));
    // 文字列を比較
    if (strcmp(str1, "HelloWorld") == 0) {
        printf("文字列は一致します。\n");
    } else {
        printf("文字列は一致しません。\n");
    }
    return 0;
}
結合された文字列: HelloWorld
文字列の長さ: 10
文字列は一致します。

このサンプルコードでは、strcatを使って文字列を結合し、strlenで文字列の長さを取得、strcmpで文字列の比較を行っています。

ctype.h

ctype.hは、文字の分類や変換を行うための関数を提供するヘッダファイルです。

文字がアルファベットか数字かの判定や、大文字小文字の変換などをサポートしています。

関数名機能
isalpha文字がアルファベットかを判定する
isdigit文字が数字かを判定する
islower文字が小文字かを判定する
isupper文字が大文字かを判定する
tolower文字を小文字に変換する
toupper文字を大文字に変換する
#include <stdio.h>
#include <ctype.h>
int main() {
    char ch = 'A';
    // 文字がアルファベットかを判定
    if (isalpha(ch)) {
        printf("%cはアルファベットです。\n", ch);
    }
    // 文字を小文字に変換
    printf("%cを小文字に変換: %c\n", ch, tolower(ch));
    // 文字を大文字に変換
    ch = 'b';
    printf("%cを大文字に変換: %c\n", ch, toupper(ch));
    return 0;
}
Aはアルファベットです。
Aを小文字に変換: a
bを大文字に変換: B

このサンプルコードでは、isalphaを使って文字がアルファベットかを判定し、tolowertoupperで文字の大文字小文字の変換を行っています。

数学関連のヘッダファイル

C言語では、数学的な計算を行うためのヘッダファイルが用意されています。

これらのヘッダファイルを利用することで、基本的な数学関数や複素数の計算を簡単に行うことができます。

math.h

math.hは、数学関数を提供するヘッダファイルです。

基本的な算術演算から三角関数、指数関数、対数関数など、さまざまな数学的操作をサポートしています。

関数名機能
sin, cos, tan三角関数
exp指数関数
log, log10対数関数
sqrt平方根を求める
pow累乗を計算する
#include <stdio.h>
#include <math.h>
int main() {
    double angle = 45.0;
    double radians = angle * (M_PI / 180.0); // 角度をラジアンに変換
    // 三角関数の計算
    printf("sin(45度) = %f\n", sin(radians));
    printf("cos(45度) = %f\n", cos(radians));
    printf("tan(45度) = %f\n", tan(radians));
    // 平方根の計算
    double number = 16.0;
    printf("sqrt(16) = %f\n", sqrt(number));
    return 0;
}
sin(45度) = 0.707107
cos(45度) = 0.707107
tan(45度) = 1.000000
sqrt(16) = 4.000000

このサンプルコードでは、math.hを使って三角関数や平方根の計算を行っています。

角度をラジアンに変換してから計算する点に注意が必要です。

complex.h

complex.hは、複素数の計算を行うためのヘッダファイルです。

複素数の加減乗除や絶対値、偏角の計算などをサポートしています。

関数名機能
cabs複素数の絶対値を求める
carg複素数の偏角を求める
creal, cimag複素数の実部と虚部を取得する
cadd, csub,
cmul, cdiv
複素数の加減乗除
#include <stdio.h>
#include <complex.h>
int main() {
    double complex z1 = 1.0 + 2.0 * I;
    double complex z2 = 1.0 - 1.0 * I;
    // 複素数の加算
    double complex sum = z1 + z2;
    printf("z1 + z2 = %.2f + %.2fi\n", creal(sum), cimag(sum));
    // 複素数の絶対値
    printf("|z1| = %.2f\n", cabs(z1));
    // 複素数の偏角
    printf("arg(z1) = %.2f\n", carg(z1));
    return 0;
}
z1 + z2 = 2.00 + 1.00i
|z1| = 2.24
arg(z1) = 1.11

このサンプルコードでは、complex.hを使って複素数の加算、絶対値、偏角の計算を行っています。

複素数の演算は、実部と虚部をそれぞれ取得して表示しています。

時間関連のヘッダファイル

C言語では、時間の管理や計測を行うためのヘッダファイルが用意されています。

これらのヘッダファイルを利用することで、現在の時刻の取得や時間の計測、時間のフォーマット変換などを行うことができます。

time.h

time.hは、時間に関する関数を提供する標準ヘッダファイルです。

現在の時刻の取得や、時間のフォーマット変換、時間の差の計算などをサポートしています。

関数名機能
time現在の時刻を取得する
difftime2つの時刻の差を計算する
ctime時刻を文字列に変換する
strftime時刻を指定したフォーマットの文字列に変換する
localtime時刻を現地時間に変換する
#include <stdio.h>
#include <time.h>
int main() {
    // 現在の時刻を取得
    time_t now = time(NULL);
    // 時刻を文字列に変換
    printf("現在の時刻: %s", ctime(&now));
    // 時刻を現地時間に変換
    struct tm *local = localtime(&now);
    printf("現地時間: %02d:%02d:%02d\n", local->tm_hour, local->tm_min, local->tm_sec);
    return 0;
}
現在の時刻: Wed Oct 11 14:23:45 2023
現地時間: 14:23:45

このサンプルコードでは、time.hを使って現在の時刻を取得し、ctimeで文字列に変換、localtimeで現地時間に変換して表示しています。

sys/time.h

sys/time.hは、より詳細な時間の計測を行うためのヘッダファイルです。

マイクロ秒単位での時間計測や、タイマーの設定などをサポートしています。

特に、UNIX系システムでの使用が一般的です。

構造体名機能
struct timeval秒とマイクロ秒を表す構造体
関数名機能
gettimeofday現在の時刻をstruct timeval形式で取得する
#include <stdio.h>
#include <sys/time.h>
int main() {
    struct timeval start, end;
    // 現在の時刻を取得
    gettimeofday(&start, NULL);
    // ここで何らかの処理を行う
    for (volatile long i = 0; i < 1000000; i++);
    // 処理後の時刻を取得
    gettimeofday(&end, NULL);
    // 経過時間を計算
    long seconds = end.tv_sec - start.tv_sec;
    long microseconds = end.tv_usec - start.tv_usec;
    double elapsed = seconds + microseconds*1e-6;
    printf("処理にかかった時間: %.6f秒\n", elapsed);
    return 0;
}
処理にかかった時間: 0.002345秒

このサンプルコードでは、sys/time.hを使って処理の開始時刻と終了時刻を取得し、経過時間を計算しています。

gettimeofdayを用いることで、マイクロ秒単位での精密な時間計測が可能です。

メモリ管理関連のヘッダファイル

C言語では、動的メモリ管理を行うためのヘッダファイルが用意されています。

これらのヘッダファイルを利用することで、プログラム実行時に必要なメモリを動的に確保したり解放したりすることができます。

stdlib.h

stdlib.hは、入出力関連だけでなく、、動的メモリ管理を行うための関数も提供しているヘッダファイルです。

メモリの確保や解放、プログラムの終了など、さまざまなユーティリティ関数が含まれています。

関数名機能
malloc指定したバイト数のメモリを動的に確保する
calloc初期化されたメモリを動的に確保する
realloc既に確保されたメモリのサイズを変更する
free確保したメモリを解放する
#include <stdio.h>
#include <stdlib.h>
int main() {
    // メモリを動的に確保
    int *array = (int *)malloc(5 * sizeof(int));
    if (array == NULL) {
        printf("メモリの確保に失敗しました。\n");
        return 1;
    }
    // 配列に値を代入
    for (int i = 0; i < 5; i++) {
        array[i] = i * 10;
        printf("array[%d] = %d\n", i, array[i]);
    }
    // メモリを解放
    free(array);
    return 0;
}
array[0] = 0
array[1] = 10
array[2] = 20
array[3] = 30
array[4] = 40

このサンプルコードでは、mallocを使ってメモリを動的に確保し、配列に値を代入しています。

最後に、freeを使って確保したメモリを解放しています。

malloc.h

malloc.hは、動的メモリ管理に関連する関数の宣言を含むヘッダファイルです。

stdlib.hと同様に、メモリの確保や解放を行うための関数が含まれていますが、通常はstdlib.hを使用することが一般的です。

関数名機能
malloc指定したバイト数のメモリを動的に確保する
calloc初期化されたメモリを動的に確保する
realloc既に確保されたメモリのサイズを変更する
free確保したメモリを解放する

malloc.hは、歴史的な理由で存在している場合が多く、現代のCプログラミングではstdlib.hを使用することが推奨されています。

malloc.hを使用する場合も、stdlib.hと同様の関数を利用することができます。

注意点

malloc.hを使用する場合、特に古いコードベースや特定のプラットフォームでの互換性を考慮する必要がある場合に限られます。

新しいプロジェクトでは、stdlib.hを使用することが一般的です。

エラーハンドリング関連のヘッダファイル

C言語では、プログラムの実行中に発生するエラーを適切に処理するためのヘッダファイルが用意されています。

これらのヘッダファイルを利用することで、エラーの検出やデバッグを効率的に行うことができます。

errno.h

errno.hは、エラー番号を管理するためのヘッダファイルです。

システムコールやライブラリ関数がエラーを返した際に、エラーの詳細を知るために使用されます。

errnoというグローバル変数を通じて、エラーの種類を特定することができます。

機能名機能
errnoエラー番号を格納するグローバル変数
perrorエラーメッセージを標準エラー出力に表示する
strerrorエラー番号に対応するエラーメッセージを取得する
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
    FILE *file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        // エラー番号を表示
        printf("エラー番号: %d\n", errno);
        // エラーメッセージを表示
        perror("ファイルを開くことができません");
        printf("エラーメッセージ: %s\n", strerror(errno));
    }
    return 0;
}
エラー番号: 2
ファイルを開くことができません: No such file or directory
エラーメッセージ: No such file or directory

このサンプルコードでは、存在しないファイルを開こうとした際に発生するエラーをerrnoで取得し、perrorstrerrorを使ってエラーメッセージを表示しています。

assert.h

assert.hは、プログラムのデバッグを支援するためのヘッダファイルです。

assertマクロを使用して、プログラムの実行中に特定の条件が満たされているかをチェックし、条件が満たされない場合にプログラムを中断してデバッグ情報を表示します。

  • 主な機能
  • assert: 条件が偽の場合にプログラムを中断し、エラーメッセージを表示する
#include <stdio.h>
#include <assert.h>
int main() {
    int x = 5;
    int y = 0;
    // yが0でないことを確認
    assert(y != 0);
    // yが0の場合、以下の行は実行されない
    int result = x / y;
    printf("結果: %d\n", result);
    return 0;
}
Assertion failed: (y != 0), function main, file example.c, line 8.

このサンプルコードでは、assertを使ってyが0でないことを確認しています。

yが0の場合、assertが失敗し、プログラムは中断されてエラーメッセージが表示されます。

assertはデバッグ時に有効で、リリースビルドでは無効化されることが一般的です。

特殊な用途のヘッダファイル

C言語では、特定の用途に特化したヘッダファイルが用意されています。

これらのヘッダファイルを利用することで、ファイル操作やネットワーク通信、スレッド管理などの高度な機能を実装することができます。

ファイル操作関連

fcntl.h

fcntl.hは、ファイル制御に関する操作を行うためのヘッダファイルです。

ファイルディスクリプタの操作や、ファイルのロック、非同期I/Oの設定などをサポートしています。

  • 主な機能
  • fcntl: ファイルディスクリプタの操作を行う
  • ファイルロックの設定
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
    int fd = open("example.txt", O_WRONLY | O_CREAT, 0644);
    if (fd == -1) {
        perror("ファイルを開くことができません");
        return 1;
    }
    // ファイルをロック
    struct flock lock;
    lock.l_type = F_WRLCK;
    lock.l_whence = SEEK_SET;
    lock.l_start = 0;
    lock.l_len = 0;
    if (fcntl(fd, F_SETLK, &lock) == -1) {
        perror("ファイルをロックできません");
        close(fd);
        return 1;
    }
    // ファイルに書き込み
    write(fd, "Hello, World!\n", 14);
    // ファイルを閉じる
    close(fd);
    return 0;
}

unistd.h

unistd.hは、POSIXオペレーティングシステムAPIを提供するヘッダファイルです。

ファイル操作やプロセス管理、システムコールなど、UNIX系システムでの基本的な操作をサポートしています。

機能名機能
readファイルの読み込み
writeファイルの書き込み
closeファイルディスクリプタを閉じる
forkプロセスの生成
execプロセスの実行
#include <stdio.h>
#include <unistd.h>
int main() {
    char buffer[128];
    ssize_t bytesRead;
    // 標準入力から読み込み
    bytesRead = read(STDIN_FILENO, buffer, sizeof(buffer) - 1);
    if (bytesRead > 0) {
        buffer[bytesRead] = '\0';
        printf("入力された文字列: %s", buffer);
    }
    return 0;
}

ネットワーク関連

socket.h

socket.hは、ソケット通信を行うためのヘッダファイルです。

ネットワークプログラミングにおいて、ソケットの作成や接続、データの送受信をサポートしています。

機能名機能
socketソケットの作成
connectソケットをサーバに接続
bindソケットにアドレスを割り当て
listen接続要求を待つ
accept接続要求を受け入れる
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main() {
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        perror("ソケットの作成に失敗しました");
        return 1;
    }
    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(8080);
    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
        perror("接続に失敗しました");
        return 1;
    }
    printf("サーバに接続しました\n");
    close(sock);
    return 0;
}

netinet/in.h

netinet/in.hは、インターネットプロトコルに関する定義を提供するヘッダファイルです。

IPアドレスやポート番号の設定、ネットワークバイトオーダーの変換などをサポートしています。

機能名機能
struct sockaddr_inIPv4アドレスを表す構造体
htons, htonlホストバイトオーダーからネットワークバイトオーダーへの変換
ntohs, ntohlネットワークバイトオーダーからホストバイトオーダーへの変換
#include <stdio.h>
#include <netinet/in.h>
int main() {
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8080);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    printf("ポート番号: %d\n", ntohs(addr.sin_port));
    return 0;
}

スレッド関連

pthread.h

pthread.hは、POSIXスレッドを利用するためのヘッダファイルです。

マルチスレッドプログラミングにおいて、スレッドの作成や管理、同期をサポートしています。

機能名機能
pthread_create新しいスレッドを作成する
pthread_joinスレッドの終了を待つ
pthread_mutex_lock
pthread_mutex_unlock
ミューテックスによる排他制御
#include <stdio.h>
#include <pthread.h>
void *print_message(void *ptr) {
    printf("%s\n", (char *)ptr);
    return NULL;
}
int main() {
    pthread_t thread;
    const char *message = "スレッドからのメッセージ";
    // スレッドを作成
    pthread_create(&thread, NULL, print_message, (void *)message);
    // スレッドの終了を待つ
    pthread_join(thread, NULL);
    return 0;
}

semaphore.h

semaphore.hは、セマフォを利用するためのヘッダファイルです。

スレッド間の同期を行うためのセマフォ操作をサポートしています。

機能名機能
sem_initセマフォを初期化する
sem_waitセマフォを待つ
sem_postセマフォを解放する
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
sem_t semaphore;
void *thread_function(void *arg) {
    sem_wait(&semaphore);
    printf("スレッドがセマフォを取得しました\n");
    sem_post(&semaphore);
    return NULL;
}
int main() {
    pthread_t thread;
    sem_init(&semaphore, 0, 1);
    // スレッドを作成
    pthread_create(&thread, NULL, thread_function, NULL);
    // スレッドの終了を待つ
    pthread_join(thread, NULL);
    sem_destroy(&semaphore);
    return 0;
}

このサンプルコードでは、semaphore.hを使ってセマフォを初期化し、スレッド間での同期を行っています。

セマフォは、スレッドがリソースを安全に共有するための手段として利用されます。

よくある質問

ヘッダファイルをインクルードしないとどうなるのか?

ヘッダファイルをインクルードしない場合、プログラム内で使用している関数や変数の宣言が見つからず、コンパイルエラーが発生することがあります。

例えば、標準ライブラリの関数を使用する際に対応するヘッダファイルをインクルードしないと、コンパイラはその関数のプロトタイプを認識できず、未定義の関数としてエラーを報告します。

例:#include <stdio.h>を忘れると、printf関数が未定義としてエラーになります。

同じヘッダファイルを複数回インクルードするとどうなるのか?

同じヘッダファイルを複数回インクルードすると、通常はコンパイルエラーが発生する可能性があります。

これを防ぐために、ヘッダファイルにはインクルードガードを使用することが一般的です。

インクルードガードは、#ifndef#define#endifプリプロセッサディレクティブを使用して、ヘッダファイルの内容が一度だけインクルードされるようにします。

例:#ifndef HEADER_H#define HEADER_H#endif

ヘッダファイルの中で関数を定義しても良いのか?

ヘッダファイルの中で関数を定義することは一般的には推奨されません。

ヘッダファイルは通常、関数の宣言や型定義、マクロ定義を含むべきです。

関数の定義をヘッダファイルに含めると、複数のソースファイルで同じ関数が定義されることになり、リンクエラーが発生する可能性があります。

関数の定義は、ソースファイルに記述し、ヘッダファイルにはそのプロトタイプを記述するのが良い習慣です。

まとめ

C言語のヘッダファイルは、プログラムの構造を整理し、再利用性を高めるために重要な役割を果たします。

この記事では、標準ヘッダファイルの一覧や、特定の用途に応じたヘッダファイルの機能について詳しく解説しました。

これにより、プログラムの開発において、適切なヘッダファイルを選択し、効率的に利用するための知識を得ることができたでしょう。

今後は、実際のプログラミングにおいて、この記事で学んだ知識を活用し、より効率的でエラーの少ないコードを書くことを心がけてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す