最近は私が開発で使っているプログラミング言語はC++とC#が主なのですが、ちょっと前まではガッツリC言語で書いていました。

そのときに使っていたC言語のバージョンはC99でした。1999年の終わりに制定された国際標準規格だからC99という通称で呼ばれています。

最新のC言語のバージョンはC17です。ちょっとややこしいのですが、規格が制定されたのは2018年ですが内容が固まったのが2017年なのでC17と呼ばれることが多いようです(C18という呼び方もあります)。C17はC11を微妙に修正しただけで機能としては変わりません。

それらを踏まえて、これからの内容を読み進めていただければと思います。

どうも世の中では、いまだにC89またはC90が使われることのほうが多いようです。C89というのは1989年にANSIによって、C90は1990年にISOによって標準規格になったもので内容は同じです。今回は便宜的に、両方を区別せずC89と呼ぶことにします。

1989年というと平成元年ですよ。もう30年以上も前の規格なんです。その後、コンピュータの進化その他にあわせてC言語も進化しているんです。しかし、そうした進化を一切はねのけて懐古趣味的な旧規格に固執する人たちがいるようです。

そういう私も大きなことはいえないのかもしれません。何しろ、主に使っているのがC99で、これまた20年以上前の規格だからです。ただ、私がちょっと前の開発でC99を使うことにした理由は明確で、使用していた開発ツールがC99までしか対応していなかったからです。決して懐古趣味ではありません。

そういえばその前の別の開発でもC99を使っていました。そのときはGCCだったのでC11も使えたはずです。「なぜC99を使ったんだろう?」と一瞬考えましたが、これまた理由は明確でした。

そのときの開発では、Windowsと某マイコンの両方をターゲットにしていました(WindowsではMinGW-w64を使っていました)。Windowsと某マイコンを対象としたプログラムはまったく別だったのですが、一部に共通部分があり、それを実装するのにC99を使っていました。某マイコンの開発ツールがC99までしか対応していなかったからです。共通部分以外はWindowsではほぼC++とC#を使っていましたので、C言語についてはC99に統一したのです。

あらためて考えてみると、私がC言語を使うのはほぼマイコンのプログラミングだけです。それであれば、C11をどうしても使いたくなるほどの理由は実はあまりありません。せいぜい、_Alignas指定子、_Alignof演算子、_Static_assert程度で、いずれもなくてもどうにかなります。あれば便利なのは確かなのですが、可変長配列が使えなくなる可能性があるなど、代償もあります。

一方で、新規開発であるにも関わらず、C99を使わずC89を使い続ける理由はあまり見当たりません。もちろん、開発ツールがC89にしか対応していないのであればしかたがありませんが、そうでなければ考えられる理由は次のいずれかです。

  • 開発ツールの評価・認証プロセスが大変で、簡単には新しいものに変更できない。
  • 怠慢により新しい規格を勉強していない。
  • 単なる懐古趣味

担当者がマゾヒストといった理由も考えられないわけではないのですが、ここでは除外することにしました。

C言語の歴史は長く、最初のものが登場したのは確か1972年だったと思います。C89ができるまでに17年もかかっています。その後も、C89に対応した処理系が普及するまで結構な時間がかかっています。その間に古い流儀が染みついてしまった人も当然少なくありませんでした。

そういえば、まだC99がなかった1990年代終わりごろ、関数原型(いわゆるプロトタイプ)を書いていると、現場の責任者から「なぜ分離形式で書かないのか?」と追及されたことがありました。彼も馬鹿ではなかったので、関数原型の有用性を説明すればちゃんと理解してくれました。

怠慢によってC89をいつまでも使い続けるのも問題ですが、新しいC言語を使うべき理由をきちんと説明しないのもまた怠慢です。多くの現場でいまだにC89を使い続けている本当の理由はどこになるのでしょうかねえ?