質問: こんにちは C/C++の入門サイトを見ていると、ヘッダファイルを2重インクルードするのはNG。インクルードガードを使いましょうと記載されています。 仕事でプログラムを書いているので、インクルードガードの仕組みや使い方は普通に理解できます。 わからないと点は、java/C#はインクルードガードという概念自体が無いのに、C言語は何故こんな面倒な事をやらなくちゃいけなくなったのかという点です。 私が考えた所によると 1. C99とかで言語仕様が決まっているから 2. コンパイラの技術が低い時代に作られたプログラムが残っているので、互換性が~という理由 3. そもそも、コンパイラ的に対応ができない あたりかなと思いました。 何故、今の時代になっても、C言語では2重インクルードが発するんですか?
回答: 3択の中から選ぶとすれば、「3 そもそも、コンパイラ的に対応ができない」です。 というのも、そもそも`#include`はプリプロセッサへの指令で、コンパイラがソースを読む段階では**消えてなくなっています**。プリプロセッサは機械的に文字展開するだけですので、重複していても(インクルードガードがない限り)全く気にしません。