このページの内容

2.6 If-then-elseでファイルをマージする

diffを使うと、Cのソースコードの2つのファイルをマージできます。この書式のdiffの出力には、両方のファイルのすべての行が含まれます。両方に共通する行は1回だけ出力されます。異なる部分は、Cプリプロセッサーの指令#ifdef nameまたは#ifndef name、#else、#endifで区切られます。出力をコンパイルするときは、マクロnameを定義するか未定義のままにすることで、使う版を選びます。

2つのファイルをマージするには、diffを-D nameまたは--ifdef=nameオプションとともに使います。引数nameは、#ifdefと#ifndef指令で使うCプリプロセッサーの識別子です。

たとえば、wait (&s)の呼び出しをwaitpid (-1, &s, 0)に変更し、--ifdef=HAVE_WAITPIDオプションで古いファイルと新しいファイルをマージすると、該当するコード部分は次のようになることがあります。

    do {
#ifndef HAVE_WAITPID
        if ((w = wait (&s)) < 0  &&  errno != EINTR)
#else /* HAVE_WAITPID */
        if ((w = waitpid (-1, &s, 0)) < 0  &&  errno != EINTR)
#endif /* HAVE_WAITPID */
            return w;
    } while (w != child);

次の節で説明する行グループ書式と行書式を使うと、C以外の言語の書式を指定できます。