#include は指定したファイルの内容を全てその行に取り込むというだけで、取り込むファイルには制限はありません。だから cpp ファイルを include することもできるし、例えば STLport では実際にそれを行っている。 _vector.h が _vector.c を include していたりする。今朝になって、これは export をまともにサポートするコンパイラが現れたときに同じソースを流用するためのものなのかな、と思った。ちょっとだけソースを読んでみたけれど、なんだかそれっぽい。
#include を行う行も、別にファイルの先頭である必要はない。ファイルの途中であろうと、関数の中であっても、最終的にコンパイラが読めるもになっていればそのまま通る。だから、以下のようなソースだって、動いてしまう。
#includeint main() { int csv[] = { #include "num.csv" }; for(int i = 0; i < sizeof(csv) / sizeof(csv[0]); ++i) { printf("%d\n", csv[i]); } return 0; }
なんとなく書いてみましたが、オチはありません。通勤途中、ちょっと思いついただけです……。 というか、上のソース書いていて何か既視感があると思ったら cppll で既出だった罠。思い出しただけか。
boost の bind のソースを読んでいるときに、全く同じメンバを持つ複数のクラスを定義しているところで、その全く同じメンバを定義する部分をファイルに抜き出して、クラス定義の中には include 一行でまとめる、みたいな事をやっていましたが、ああいう使い方もかっこいいですね。