閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

#include

#include は指定したファイルの内容を全てその行に取り込むというだけで、取り込むファイルには制限はありません。だから cpp ファイルを include することもできるし、例えば STLport では実際にそれを行っている。 _vector.h が _vector.c を include していたりする。今朝になって、これは export をまともにサポートするコンパイラが現れたときに同じソースを流用するためのものなのかな、と思った。ちょっとだけソースを読んでみたけれど、なんだかそれっぽい。

#include を行う行も、別にファイルの先頭である必要はない。ファイルの途中であろうと、関数の中であっても、最終的にコンパイラが読めるもになっていればそのまま通る。だから、以下のようなソースだって、動いてしまう。

#include 
int 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 一行でまとめる、みたいな事をやっていましたが、ああいう使い方もかっこいいですね。