わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

こんにちは,エラーのある世界 (4)日本語文字を入れたら

こんにちは,エラーのある世界(0)のhello.cについて,5行目の「printf」の前の空白2文字分を,日本語文字の「 」に変更して,hello4.cという名前で保存しておきます.
このファイルをコンパイルすると,エラーになります.今回もまた,実行環境1と実行環境2とで,エラーメッセージが一部異なって表示されました.
実行環境1のコマンドは:

$ cat hello4.c
#include <stdio.h>

int main(void)
{
 printf("hello, world\n");

  return 0;
}
$ cc hello4.c
hello4.c: In function ‘main’:
hello4.c:5:1: error: stray ‘\343’ in program
 printf("hello, world\n");
 ^
hello4.c:5:2: error: stray ‘\200’ in program
 printf("hello, world\n");
  ^
hello4.c:5:3: error: stray ‘\200’ in program
 printf("hello, world\n");
   ^

実行環境1では:

実行環境2では:

実行環境2の「printf」の前に,3文字または2文字分,おかしな表示が出ます.文字による表現は困難なので,「実行環境2のコマンド」のほうは,省略します.
どちらの実行環境でも,エラーを報告する行の最初は「hello4.c:5:1: error: stray ‘¥343’ in program」です.このうち「stray」は「はぐれた」または「範囲を超えた」という意味の形容詞です.ここではhello4.cの5行目の1文字目が,Cで'¥343'と表すことのできる文字であり,この文字はコンパイルのしようがない*1のでエラー,と言っています.
「stray」を含むCのコンパイルエラーを見かけたら,全角空白または日本語文字の記号が,その行に入っている,と考えるのがよいでしょう.テキストエディタでその行にカーソルを移動させ,右のキーをリズムよく押しながら,行全体でカーソルを動かしてみると,ASCII文字の1文字分よりも大きく,カーソルが動くことがあります*2.そこが,修正すべき日本語文字の箇所となります.
なお,3つのエラーで「‘¥343’」「‘¥200’」「‘¥200’」が縦に並んでいますが,それぞれ1バイトとしてこの3バイトで,UTF-8における全角空白1文字分の文字コードを表します*3.他の日本語文字なら他の値になります.

*1:コメントや文字列に,日本語文字を使用するのであれば,コンパイルエラーは出ません.

*2:この記事をブラウザでご覧の方は,「実行環境1のコマンドは:」の直後の囲みの中を,領域指定してみてください.hello4.cの「printf」の手前の文字だけ,他より大きいのを,確認できると思います.

*3:「echo -n ' ' | hexdump -b」というコマンドで,「343 200 200」の出力が得られます.いずれも8進数です.16進数にするなら代わりに「echo -n ' ' | hexdump -C」を実行します.出力には「e3 80 80」が含まれます.