dポイントプレゼントキャンペーン実施中!

ある書物に「ヘッダファイルを複数回インクルードすると、それを”再定義”することによるエラーになる」と書いてありますたが、以下のようなヘッダファイルを作りそれを数回インクルードしても何ら異状が無くコンパイルできました。
math.h→ヘッダファイル名
#define max(a,b)  ((a)>(b)?(a):(b))→ヘッダファイルの内容

c ファイル
#include<stdio.h>
#include"math.h"←複数回インクルード
#include"math.h"←複数回インクルード

int main(void){
int x=1,y=2;
printf("max(x,y)=%d\n",max(x,y));
return 0;
}
環境としては、RedHat Linuxでviです。
何ゆえ、エラーにならないのか良く解りません。
宜しくお願いします。

A 回答 (4件)

標準ヘッダにも math.h があります。


自作ヘッダを、標準ヘッダと重複しない名前に変えてから
もう一度やってみてはいかがでしょうか。
    • good
    • 0

2重定義にならない仕掛けがあります。



コンパイラが用意しているインクルードファイルには、
インクルードファイル毎に、特定の名前をdefineして
います。
その名前が既に定義されていたら、インクルードファ
イルをスキップするように作られています。

このテクニックは自分で作ったインクルードファイル
に応用可能です。
    • good
    • 0

マクロは、定義内容が同じであれば、複数回定義してもエラーにはなりません。


そのとき、1個以上の空白類は個数が変わっても構いません。ただし、空白類が0個と1個以上は別ものとしてあつかわれるの要注意です。

他には、関数原型やオブジェクトの仮宣言も、複数あってもエラーにはなりません。
C++の場合、typedefも複数あってもエラーにはなりません。
    • good
    • 0

そのヘッダーファイルを開くとよくわかる



最初に
#ifndef __MATH_H
#define __MATH_H
というような2行があるかと思います
__MATH_Hと言う定義がなかったら定義せよ、て感じですね。
だから2回め読み込んだときには既に定義されているので、
#ifndef~#endifまでが読まれず、エラーにならないと。

もしないなら、別の手段ですね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!