2016/02/05

UNIX V6のC言語の妙な挙動

UNIX V6のC言語には思いもよらない動きをすることを知りました。現象を再現するために以下の3つのファイル(test.c, v6.c, test.h)を使用します。

まずtest.cを示します。
     1  /*
     2   * test.c
     3   */
     4
     5  #include "test.h"
     6
     7  test()
     8  {
     9          return 0;
    10  }
次にv6.cを示しますが、test.cとの違いは1行目に「#」があることだけです。
     1  #
     2  /*
     3   * test.c
     4   */
     5
     6  #include "test.h"
     7
     8  test()
     9  {
    10          return 0;
    11  }
インクルードしているtest.hを示しますが、内容に意味があるわけではありません。
     1  /* test.h */
UNIX V6のC言語で各々をコンパイルしようとすると、驚くような挙動を示します。
# cc -c test.c
5: Unknown character
7: Expression syntax
8: External definition syntax
# cc -c v6.c
# diff test.c v6.c
0a1
. #
test.cでは#includeが現れた行で「Unknown character」というエラーが出て、それに引きずられるようにエラーが続きます。ところがv6.cでは何事もなくコンパイルが出来ます。相違点は1行目の「#」の有無だけです。

どうしてこういうことになるのか理解していませんが、UNIX V6のC言語はこういうものなのだと思うしかないでしょう。/usr/source/c/c00.cなどを見ても、1行目に「#」があります。『Lions' Commentary on UNIX』でも、和訳のアスキー版でも86頁にあるmain.cの最初の行(1500行目となっている個所)を見ると、さりげなく「#」があります。うっかりすると見過ごしてしまいそうですが。


0 件のコメント:

コメントを投稿