エディタを作る for Win 1日目

Qiita (キータ) と呼ばれる、Webページ=プログラマのための技術情報共有サービスがある。 その中で「エディタを作る」という記事を見つけた。
 URL = https://qiita.com/tinyco/

画像1

 わずか 25日 で コンソールで動くエディタを作ろう! という挑戦なのだが、使っているPCが mac (マック)で、実行環境がBASH という、かなり特殊な状況で開発している。 (Windowsでもなければ、Linuxでもない)
タイトルが「自作エディタをつくる Advent Calendar 2016」となっているので これで検索をかければ すぐに見つかると思う。(このタイトル自体が日本語として少々おかしい気もするが…)
 開発言語が 「C言語」(gcc) とのことなので、多少 開発環境が違っていても 作れる(移植できる)だろうとの 甘い考えで、こちらでは 普通にWindows機で 開発環境も Visual Studio 2019 (2010~2017でも可)を使って行うと思う。  無料の Community版もあるので これなら 誰でも始められる=始める敷居が低くなるだろうと考えての選択だ! 

もし、Visual Studio 2017 あたりで作成しようとすると、こんな ↓ 感じで「プロジェクト」を先に作らないといけないが、それでも gccをコンソールから呼び出してコンパイルするより楽だろう。

VS2017 プロジェクト

簡単なテストプログラムであるため「ソリューション」を作る必要はない。

25日で完成させる簡易なエディタで、その1日目のソースがこれ ↓

// main.c

#include <stdio.h>

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

プログラマを目指す人は、たったこれだけのソースファイルを見て 「なんだか、気持ち悪い!」という感覚を持てるようになって欲しい。

本来のオリジナル原本は 1行目のコメント // main.c すら無い。 
何が最も問題か? というと main関数が、戻り値=intと宣言されているのに return文 が無い所だ!

C言語などの解説書で有名な 柴田望洋さんの書籍の中に、「最近はint 戻りのmain()関数なのに retrunを書かないのが流行っている」・・・みたいな内容が書かれていて、その時は「何のことだろう?」と分からなかったが、やっとわかった。 おそらく この様なソースの事を指しているのだろう。 書籍ではこれも許されるような解説をしていたが、こんなクセは最初に直しておいた方が良い!

簡単な話だ。
 ① 戻り値 int で宣言した関数は 必ず return で値を返す。
 ② void で宣言した関数は 値を返さない・・・ いや 言い方が逆だ!
  return文で値を返さない関数は 必ず void 宣言する。
たった これだけの事だ。

丁寧に歴史的な説明をすると、
C言語が作られた当初は void というキーワードは存在しなかった。
 だから 値を返さない関数は、その先頭に何も書かないし、引数の無い関数は、カッコの中に何も書かずに表現した。 → 0a_hello-old参照
① こんな感じ ↓ (これでもちゃんとコンパイルできる)

main() 
{
	printf("hello,world.\n");
}

② それが、voidの概念が導入されてからは ↓

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

こんな書き方が推奨されるようになった。(無い所にはvoidを明示する)

ただし、注意してほしいのは main()関数をvoid宣言で書くと ボロクソに批判する妄信者がいることを!
 例えば 下記の書籍「C/C++プログラミングの迷信と誤解」を参照。

02_本-迷信と誤解

重箱の隅をほじくり返すような ↓ こんな事が書かれていたりする
(C言語では void main() も 有効なのに・・・)

画像4

こんな どうでも良い論争で批判されるよりは、ちゃんと戻り値を返す書き方をするのが無難です ↓ 
③ 標準的な書き方

int  main( void ) 
{
	printf("hello,world.\n");
    return 0;
}

④ そして、最近の傾向では (C++やC#では)「引数の無い関数はカッコの中にvoidを書かない方が良い」とされています。
こんな感じ ↓

int  main() 
{
	printf("hello,world.\n");
    return 0;
}

「必ずvoidを書きましょう」と指導していたのは、いったい何だったんだ?と疑問に思うが、 所詮 「見やすいソース」の書き方なんて 時代と共にコロコロ変わっていくものだ・・・。

p.s.  ちなみに、
 最近の書籍上のサンプル・プログラムでは、main()に限らず 関数の開始の大カッコ { を 1行に続けて書く傾向にあるが、↓

int main() {
  ・・・

個人的には、どうもこの書き方が好きではない。

関数の開始{ は、改行して別の行の先頭に置くの ↓ が好みだ。

int main()
{
  ・・・

これなら 関数の切り出しに、「行頭(1文字目が)が{ なら関数」という 単純なルールが使える。

こんな 1行ぐらいは 紙面をケチらないでも良いのに、と思う。

ハッシュタグ
#C言語 #エディタを作る


いいなと思ったら応援しよう!