LoginSignup
70
64

More than 5 years have passed since last update.

旧時代のC言語を使うのはそろそろやめよう。

Posted at

まず、何も言わずに下記の記事をお読んでください。

英語は・・・という方は、下の翻訳をお読みください。

これからのC言語を考える。

さて、上の記事を読みましたか?まだ読んでない?いや、読みましょうよ、ということで読んだことを前提でお話しします。

C言語知っているぜ!と言っている諸兄の方々の中には、何これ?と思ったのもあったかと思います。聖典 K&R は仕方が無いとしても、C言語入門を謳う書籍やサイトの中では C90 止まりが多く見られます。どうやら、彼らは20世紀で時間が止まっているようです。

レガシーなコンパイラをサポートするため、古くからあるコードが存在するため、そういった理由で C90 を使い続けるのが駄目というわけではありません。例えば MRI (Ruby のC言語実装) は未だに C90 です1。しかし、これから新たに作るようなプログラムでも C90 を使い続けるのはほとんど無意味でしょう。これからは C99 も越えて C11 をメインに据えるべきでは無いでしょうか。

C言語はかく有るべき。

ということで、私の独断と偏見により、上の記事から追加で、これからはこうすべきと考えます。

  • 基本的に C11 を使用します。
  • サポートするコンパイラを GCCClang に限定します。オプションには -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_tchar32_t を使うべきです。
  • マルチスレッドは <threads.h> を使います。ただし、現在の所、対応ライブラリは存在しないため、エミュレーションライブラリを使います。Linux等の pthread 環境でも、pthread が無い Windows でも、統一的に書くことが出来ます。
  • インライン展開による速度向上が目的であれば、マクロ関数ではなくインライン関数を使います。マクロ関数はマクロにしないと出来ないという理由が無い限り使うべきではありません。
  • 制御が戻らない関数は <stdnoreturn.h> を読み込んで、noreturn を付けます。
  • 無名構造体や無名共有体は積極的に使います。特に入れ子の場合は、余程の理由が無い限り無名にします。
  • _Generic は便利とは言い難いです。C++ のテンプレートほどの汎用性はありません。ライブラリのインターフェースとしては有用かも知れませんが、余程の理由が無い限り無理に使うのはやめましょう。
  • long double は、現在の所、その利用価値はほとんどありません。浮動小数点数は double を使用して下さい。
  • 浮動小数点数の複素数計算をする場合は <complex.h> を読み込んで double complex 型を使いましょう。

  1. これに対して、組み込み向けの Ruby である mruby は C99 です。 

  2. Visual C++ 2015 でも u8"..." は正しく解釈されます。ソースコードがどんな文字コードであっても UTF-8 としてコンパイルされるため、文字コードについて悩む必要はありません。 

70
64
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
70
64