Shift_JIS対応しているCコンパイラを使おう!

概要

懐かしい話題が流れてきたので、ちょっと実験してみました。

記事

SJISでコーディングしてはいけない、たった一つの理由 - Qiita
ダメ文字を意識しながらコーディングしなければならないからです。 ダメ文字とは? Shift_JISのダメ文字 ダメ文字一覧表 例 a.c # include void func(int x){ // 与えられた変数を表示するだけの機能 .....

C言語だと行末の\は次の行に続く文字として利用されています。Shift_JISで2文字目に\が入っている文字を使うと意図しない動作をするって話ですね。懐かしい。

実験コード

#include <stdio.h>

int main() {
    // 今後実装する機能
    if(0)
    {
        printf("cannot run\n");
    }

    printf("exit\n");

    return 0;
}

よくある開発中の処理はif分でブロックコメントかわりにしているコードです。これをShift_JISで保存して各種コンパイラで動きをみてみます。

WSL(gcc)

はい、gccは意図したとおり変な動きをします。これはオプションなしだとShift_JISに対応していないので、漢字の2文字目かを判定していないんですよね。

gcc test.c -finput-charset=cp932

もちろん文字コードを指定すれば正しく動きます。

Build Tools for Visual Studio 2022(cl)

すばらしい、ちゃんとShift_JIS対応しているので漢字の場合には2文字目を無視する設定になっています。

LSI C試食版(lcc)

LSI C-86の詳細情報 : Vector ソフトを探す!
LSI C-86 v3.30c 試食版

上記からダウンロードできます。

しかし16ビットアプリなので64ビットWindows環境では実行できません。

DOSVAXJ3

上記にあるDOS/V Emulatorを使って実行したいと思います。事前にLSIC86というフォルダ名にlsic330c.lzhを解凍しておきます。

なんとコンパイルエラーです。

  LSI C-86 の特長
  ^^^^^^^^^^^^^^^

  ・ANSI に準拠
        ANSI C 規格案(X3J11)に準拠したフルセットコンパイラです

そうです、LSI C-86はANSI Cに対応しているコンパイラです。おそらくC89とかですね。

C99から//がコメントとして使えるようになったので、この時代のコンパイラは/* */で囲う必要があります。

まとめ

ちなみにこんな動きがあったのでShift_JISから一気にutf8に文字コードが変わっていったりしていました。そして//のコメントが使いたいのでC++の機能を使わないのに拡張子をcからcppに変更していた時代のお話です。

コメント

  1. 匿名 より:

    gccは対応してないのでは無く、Shift_JISとして処理してないからそうなっているだけです。
    -finput-charset=cp932で文字コードを指定してあげればちゃんと解釈します。