エディタを作る for Win 1日目
Qiita (キータ) と呼ばれる、Webページ=プログラマのための技術情報共有サービスがある。 その中で「エディタを作る」という記事を見つけた。
URL = https://qiita.com/tinyco/
わずか 25日 で コンソールで動くエディタを作ろう! という挑戦なのだが、使っているPCが mac (マック)で、実行環境がBASH という、かなり特殊な状況で開発している。 (Windowsでもなければ、Linuxでもない)
タイトルが「自作エディタをつくる Advent Calendar 2016」となっているので これで検索をかければ すぐに見つかると思う。(このタイトル自体が日本語として少々おかしい気もするが…)
開発言語が 「C言語」(gcc) とのことなので、多少 開発環境が違っていても 作れる(移植できる)だろうとの 甘い考えで、こちらでは 普通にWindows機で 開発環境も Visual Studio 2019 (2010~2017でも可)を使って行うと思う。 無料の Community版もあるので これなら 誰でも始められる=始める敷居が低くなるだろうと考えての選択だ!
もし、Visual Studio 2017 あたりで作成しようとすると、こんな ↓ 感じで「プロジェクト」を先に作らないといけないが、それでも gccをコンソールから呼び出してコンパイルするより楽だろう。
簡単なテストプログラムであるため「ソリューション」を作る必要はない。
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++プログラミングの迷信と誤解」を参照。
重箱の隅をほじくり返すような ↓ こんな事が書かれていたりする
(C言語では void main() も 有効なのに・・・)
こんな どうでも良い論争で批判されるよりは、ちゃんと戻り値を返す書き方をするのが無難です ↓
③ 標準的な書き方
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行ぐらいは 紙面をケチらないでも良いのに、と思う。
。