ある書物に「ヘッダファイルを複数回インクルードすると、それを”再定義”することによるエラーになる」と書いてありますたが、以下のようなヘッダファイルを作りそれを数回インクルードしても何ら異状が無くコンパイルできました。
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です。
何ゆえ、エラーにならないのか良く解りません。
宜しくお願いします。
No.3
- 回答日時:
2重定義にならない仕掛けがあります。
コンパイラが用意しているインクルードファイルには、
インクルードファイル毎に、特定の名前をdefineして
います。
その名前が既に定義されていたら、インクルードファ
イルをスキップするように作られています。
このテクニックは自分で作ったインクルードファイル
に応用可能です。
No.2ベストアンサー
- 回答日時:
マクロは、定義内容が同じであれば、複数回定義してもエラーにはなりません。
そのとき、1個以上の空白類は個数が変わっても構いません。ただし、空白類が0個と1個以上は別ものとしてあつかわれるの要注意です。
他には、関数原型やオブジェクトの仮宣言も、複数あってもエラーにはなりません。
C++の場合、typedefも複数あってもエラーにはなりません。
No.1
- 回答日時:
そのヘッダーファイルを開くとよくわかる
最初に
#ifndef __MATH_H
#define __MATH_H
というような2行があるかと思います
__MATH_Hと言う定義がなかったら定義せよ、て感じですね。
だから2回め読み込んだときには既に定義されているので、
#ifndef~#endifまでが読まれず、エラーにならないと。
もしないなら、別の手段ですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# メインプログラムに#include <algorithm>を書いて、 そのメインプログラムが // 3 2023/05/02 11:24
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
コンパイルできません。
-
バッチからsqlplusの接続エラー...
-
適切な変換関数が存在しない???
-
fortranでプログラムを実行する...
-
C++のコンパイラーでエラー原因...
-
Excelのエラーで困ってます。
-
MQL5にて謎のエラーが発生!だ...
-
RightとLeft関数のライブ...
-
Visual Studioのstrcpy_sについて
-
C言語でpgm形式の画像を読み込...
-
sys/time.hのインクルードがで...
-
ビルドが失敗してしまいます
-
c++ セグメントエラー
-
BC30002: 型 'ListItem' が定義...
-
PC画面を録画するプログラムでd...
-
visual C++ でビルドの中止がで...
-
c#プログラムについて
-
vbsで作ったプログラムを続けて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
適切な変換関数が存在しない???
-
Excelのエラーで困ってます。
-
バッチからsqlplusの接続エラー...
-
fortranでプログラムを実行する...
-
HEWを使用しているのですが、こ...
-
コンパイルできません。
-
デバッグ中のエラーのことで教...
-
visual C++ でビルドの中止がで...
-
BC30002: 型 'ListItem' が定義...
-
Handlesについて
-
sys/time.hのインクルードがで...
-
ビルド失敗 指定されたファイ...
-
VB2008で定数に色の設定をした...
-
RightとLeft関数のライブ...
-
WindowsからLinuxへの移植
-
multiple definitionというエラー
-
HANDLEの宣言でのエラー
-
レコードセットをcloseする所で...
おすすめ情報