>>447
とりあえず標準のC言語で話を進める。

まず、Cのソースから実行可能形式にビルドするまでには、
三つのプログラムによって処理をすることになる。
・プリプロセッサ
 ―インクルードやらマクロやらを展開する
・コンパイラ
 −機械語に変換してオブジェクトファイルを作る
・リンカ
 −複数のオブジェクトファイルやライブラリをリンクして繋ぎ合わせる
これらは、それぞれ独立して処理することが可能。
でだ、その#...はプリプロセッサに対する命令であって、
コンパイラやリンカには関係が無い。
だから、コンパイラに渡されるときには既に、#include "hoge.h"という一文は、
hoge.hの中身に置き換わっているし、#ifndefなんかも処理されてなくなっている。

あくまで、それは、複数回インクルードするのを防ぐためのものであって、
その中身に関して保障されるものではない。