Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語でヘッダーファイルを2回インクルードするとどうなる?仕組みと動作を解説

ヘッダーファイルを2回インクルードするとどうなる?

C言語のヘッダーファイルには、あらかじめ定義された関数が含まれています。たとえば、printf()scanf() といった標準入出力関数は、stdio.h ヘッダーファイルの中で定義されています。

  • C言語の各ヘッダーファイルには、それぞれ異なる定義済み関数が用意されており、プログラムを簡潔で理解しやすいものにしてくれます。

  • 同じヘッダーファイルをプログラム内で2回インクルードしても、2回目はコンパイラによって自動的に無視されます。これは、ヘッダーファイル名の前に記述する #include ディレクティブが、コンパイル処理の中で各ヘッダーファイルが一度だけ取り込まれることを保証しているためです。

そのため、うっかり同じヘッダーファイルを複数回記述しても、コンパイルエラーにはならず、プログラムは正常に動作します。

補足:インクルードガードという仕組み

標準のヘッダーファイルには、内部に「インクルードガード」と呼ばれる二重インクルード防止の仕組みが組み込まれています。自作のヘッダーファイルでも、#ifndef / #define / #endif を使えば、同じように重複読み込みを防げます。

#ifndef MY_HEADER_H
#define MY_HEADER_H
/* ヘッダーの内容 */
#endif

例1:3つの数値の平均を計算するプログラム

次のCプログラムでは、stdio.h を2回インクルードしていますが、エラーにはなりません。

#include<stdio.h>
#include<stdio.h> // ヘッダーファイルを2回インクルード(コンパイラに無視される)
main(){
    int a,b,c,d;
    float avg;
    printf("Enter values for a,b,c:");
    scanf("%d%d%d",&a,&b,&c);
    d=a+b+c;
    avg=d/3;
    printf("Average avg=%f",avg);
}

実行結果

上記のプログラムを実行すると、次のような結果が出力されます。

Enter values for a,b,c:3 3 3
Average avg=3.000000

例2:複数のヘッダーファイルを重複インクルードした場合

続いて、stdio.hstdlib.h をそれぞれ2回ずつインクルードした別の例を見てみましょう。

#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
// ヘッダーファイルを2回インクルード(コンパイラに無視される)
main(){
    int a,b,c;
    printf("Enter values for a,b:");
    scanf("%d%d",&a,&b);
    c=a+b;
    printf("sum=%d",c);
}

実行結果

このプログラムも問題なく実行され、次のような結果になります。

Enter values for a,b:2 4
sum=6

まとめ

C言語では、ヘッダーファイルを何度インクルードしても、#include の仕組みとインクルードガードによって重複分は自動的に無視されるため、コンパイルエラーは発生しません。ただし、コードの可読性を高めるためにも、不要な重複インクルードは避けて記述するのが良い習慣といえます。

  1. C++で2本の直線の交点を求めるプログラムの書き方

    直線ABを定義する2点A・Bと、直線CDを定義する2点C・Dが与えられたとき、この2つの直線の交点を求めるのが課題です。 注意 − すべての点は、X座標とY座標を持つ2次元平面上にあるものとします。 図では、A(a1, a2)とB(b1, b2)を通る直線、C(c1, c2)とD(d1, d2)を通る直線という、互いに異なる2つの直線が描かれており、P(p1, p2)がその交点を表しています。 交点の求め方 まず、2点を通る直線を「ax + by = c」の形の方程式で表します。各点の座標を使って、次のように係数を計算します。 A1 = b2 - a2 B1 = a1 - b1 C1 =

  2. Pythonで2つの数の公約数を求めるプログラムの書き方

    はじめに この記事では、以下の問題文に対する解決方法について学んでいきます。 問題文 2つの整数が与えられたとき、それらに共通する約数(公約数)の個数を表示する必要があります。 アプローチの考え方 まず、入力として受け取った2つの数のうち、小さい方の値(最小値)を計算します。続いて、1からその最小値までの各値で2つの数を順番に割っていき、両方の数を割り切ることができるかどうかをループ処理で確認します。 条件が真(True)と評価されるたびに、カウンターを1ずつ増加させます。最終的なカウンターの値が、2つの数の公約数の個数となります。 実装例 それでは、以下のコードで実際の実装を見てみましょう。