まず、何も言わずに下記の記事をお読んでください。
英語は・・・という方は、下の翻訳をお読みください。
これからのC言語を考える。
さて、上の記事を読みましたか?まだ読んでない?いや、読みましょうよ、ということで読んだことを前提でお話しします。
C言語知っているぜ!と言っている諸兄の方々の中には、何これ?と思ったのもあったかと思います。聖典 K&R は仕方が無いとしても、C言語入門を謳う書籍やサイトの中では C90 止まりが多く見られます。どうやら、彼らは20世紀で時間が止まっているようです。
レガシーなコンパイラをサポートするため、古くからあるコードが存在するため、そういった理由で C90 を使い続けるのが駄目というわけではありません。例えば MRI (Ruby のC言語実装) は未だに C90 です1。しかし、これから新たに作るようなプログラムでも C90 を使い続けるのはほとんど無意味でしょう。これからは C99 も越えて C11 をメインに据えるべきでは無いでしょうか。
C言語はかく有るべき。
ということで、私の独断と偏見により、上の記事から追加で、これからはこうすべきと考えます。
- 基本的に C11 を使用します。
- サポートするコンパイラを GCC と Clang に限定します。オプションには
-std=c11
を付けます。余程特殊な環境では限り、GCC が使えないと言うことはありません。Windows では Mingw64版 GCC を使用します。 どうしても Visual C++ を使用したい場合は 2015 以上にすべきです。Borland C++ Compiler など古いコンパイラは学習目的であっても使うべきではありません。 - 文字列は常に UTF-8 で処理をします。ASCII 以外が含まれるリテラルは
u8"..."
を使います2。型はconst char *
です。リテラルを除いて、文字列の処理はすべてuint8_t *
を使います。Shift_JIS や UTF-16、UTF-32 は使用しません。Windows の場合、ANSI も UNICODE も使用しませんが、Win32API とのやり取りが必要な場合のみ UNICODE(ワイド文字) に変換します。もし、UTF-16 や UTF-32 を扱う場合は、wchar_t
は使わずに、char16_t
やchar32_t
を使うべきです。 - マルチスレッドは
<threads.h>
を使います。ただし、現在の所、対応ライブラリは存在しないため、エミュレーションライブラリを使います。Linux等の pthread 環境でも、pthread が無い Windows でも、統一的に書くことが出来ます。 - インライン展開による速度向上が目的であれば、マクロ関数ではなくインライン関数を使います。マクロ関数はマクロにしないと出来ないという理由が無い限り使うべきではありません。
- 制御が戻らない関数は
<stdnoreturn.h>
を読み込んで、noreturn
を付けます。 - 無名構造体や無名共有体は積極的に使います。特に入れ子の場合は、余程の理由が無い限り無名にします。
-
_Generic
は便利とは言い難いです。C++ のテンプレートほどの汎用性はありません。ライブラリのインターフェースとしては有用かも知れませんが、余程の理由が無い限り無理に使うのはやめましょう。 -
long double
は、現在の所、その利用価値はほとんどありません。浮動小数点数はdouble
を使用して下さい。 - 浮動小数点数の複素数計算をする場合は
<complex.h>
を読み込んでdouble complex
型を使いましょう。