だめ文字の駄目たる所以

まさにG的(敵?)

ソースコードに、だめ文字が入るのならば、\を付与するフィルタを通せば良いではないかと賢い諸兄、諸姉は言うだろう。だが、何処にでも入るのが、だめ文字なのだ。
*.cや*.cppならば、コンパイルする前にフィルタすれば良い。しかし、コンパイルしない*.hはどうするのか?修正するたび、手でフィルタを通すのか。すると、複数回通せば「だめ文字\\\\n」になる危険性さえ、孕んでいるのである。仮に、この様にならないフィルタを作ったとしよう。しかし、手動というのが頂けない。掛け忘れが発生したり、無闇やたらに実行すれば、依存関係にあるソースが無駄にリコンパイルされ、ビルド時間を大きく引き延ばすだろう。ましてや、これがライブラリの一部だったりすれば、半泣き状態である。

貴様の血は何色だ?

また、だめ文字は、目視でのデバッグを邪魔してくる厄介な敵でもある。
次のサンプルは、ASCIIのコード表を出力するだけの簡単なサンプルだが、奴が潜んでいるせいで、困った事が発生する。今は、コンパイラが充実しているおかげでコンパイル時に見つかるのだが、ある酷い職場ではwarningエラーは、すべて捨てて、見なかったことにしている場所を私は知っている。
罠が潜むサンプル

#include <stdio.h>

int
main()
{
    int h;
    int l;

    // ASCIIコード表
    printf("  +0 1 2 3 4 5 6 7 8 9 A B C D E F\n");
    for(h=0x20; h<0x80; h+=0x10) {
        printf("%02x", h);
        for(l=0; l<0x10; l++) {
            if(h+l == 0x7f) {    // 0x7fはDEL文字なので表示しない
                break;
            }
            printf(" %c", h+l);
        }
        printf("\n");
    }

    return 0;
}

答え合わせ

今回のだめ文字は、「表」である。使用されているのは2か所だが、問題を引き起こすのは、「ASCIIコード表」と書かれた部分である。
忘れがちだが、「//」によるコメントアウトは、行末が\エスケープされていると、次の行もコメントと見なす様になっている。つまり、今回は「表」の下位バイトが0x3c(\)であるため、ヘッダーを表示しているprintf()の行も、コメントアウトされているとコンパイラが判断するのである。これを見つけるのは、まさにコード職人しかいないであろう。
このサンプルでは、ヘッダー表示という、ある意味なくても困らないコードだが、これが重要な変数の変更だったり、関数の呼び出しだったりしたならば、目も当てられない。
20年前の戦いは、コンパイラがだめ文字対応するまで、結局こちらの負け。ソースコード内では日本語を使わない。日本語はNLS機能(Windowsで例えるなら、言語ファイルの入れ替えとでも言おうか…)で、カバーする。といった完全降伏状態であった。