
C言語の基本|C言語のバージョンと規格
C言語の規格の流れを知り、「どのC言語で学び、どのC言語で書くのか」を自分で判断できる基礎を身につけよう。
C言語のバージョンと規格
C言語は1970年代に誕生して以来、長い期間にわたって使われ続けてきたプログラミング言語です。
長い歴史を持つ言語というと、
「昔からずっと同じ書き方なのではないか」
と思うかもしれません。
しかし、C言語も時代に合わせて少しずつ改良されています。
その改良の区切りとして登場するのが、
- K&R C
- C89
- C99
- C11
- C17
- C23
といった名前です。
特にC89、C99、C11、C17、C23は、C言語の標準規格の世代を表すときによく使われます。WG14が公開している規格の履歴では、C89はANSI X3.159-1989、C99はISO/IEC 9899:1999、C11はISO/IEC 9899:2011、C17はISO/IEC 9899:2018、C23はISO/IEC 9899:2024に対応しています。
初心者のうちは、
「C言語なら全部同じC言語なのだから、バージョンを気にしなくてもよいのではないか」
と感じることもあるでしょう。
基本的な変数、条件分岐、繰り返し、関数などを学ぶ段階では、規格が違っても共通している部分がたくさんあります。
そのため、最初から各規格の細かな違いをすべて暗記する必要はありません。
ただし、学習を進めていくと、
- 教材に書かれているコードが自分の環境ではコンパイルできない
- あるコンパイラでは使える書き方が、別の環境では使えない
- GCCのオプションにC11やC17と書かれている
- 古いソースコードと新しい教材で書き方が少し違う
- C23という名前を見かけたが、C17との違いが分からない
といった場面が出てきます。
このとき、C言語には複数の標準規格があると知っているだけでも、状況を整理しやすくなります。
C言語の規格について学ぶ目的は、年号を暗記することではありません。
いま自分がどのルールのC言語を学んでいるのかを理解することが大切です。
この教材では、基本的にC17を学習上の基準として扱います。
現在公開されているISO Cの最新規格はISO/IEC 9899:2024、通称C23です。一方、C17はC11に対する修正を取り込んだ規格で、大規模な新機能追加よりも不具合の修正や仕様の整理が中心です。GCCの公式文書でも、C17はC11と比べて主に欠陥修正と規格識別値の違いであると説明されています。
そのため、まずC17を基準としてC言語の基本をしっかり理解し、そのあとで必要に応じてC23との違いを学んでいく、という進め方にすると整理しやすくなります。
C言語の「バージョン」は標準規格として考える
一般的なアプリケーションでは、
「バージョン1」
「バージョン2」
「2026年版」
といったバージョン番号を目にすることがあります。
C言語でC99やC17などと呼んでいるものも似ているように見えますが、少し意味が違います。
C言語の場合は、単なるソフトウェアの更新番号ではなく、C言語をどのようなルールで記述し、どのように解釈するかを定めた標準規格の世代として理解すると分かりやすいでしょう。
ISOが公開しているC言語規格では、プログラムの表現、構文や制約、意味規則、入出力データの表現、適合する処理系に関する制限などが規定されています。
簡単にいえば、
C言語として共通して守るルールを決めたもの
です。
たとえば、学校ごとに独自の交通ルールがあったら困ってしまいます。
ある学校では赤信号で止まり、別の学校では赤信号でも進んでよいとなっていたら、同じ道路を安全に利用できません。
プログラミング言語でも似た問題があります。
コンパイラごとにC言語のルールが大きく違ってしまうと、
「こちらのコンパイラでは動いたのに、別のコンパイラでは動かない」
という問題が発生しやすくなります。
そこで標準規格を定め、
「この規格に従ったC言語では、このようなルールで扱う」
という共通基準を作ります。
標準規格を知ると何が分かるのか
C言語の規格について理解しておくと、実際の学習や開発で役立ちます。
C言語の規格を学ぶ意味
| 観点 | 分かること |
|---|---|
| 互換性 | どの規格で利用できる書き方なのか判断しやすくなる |
| 教材の基準 | 教材がどのC言語を前提にしているか理解できる |
| コンパイラ | どの規格としてソースコードを解釈させるか考えられる |
| 古いコード | 昔の書き方が登場した理由を理解しやすくなる |
| 新しいコード | 新しい規格の機能なのか判断しやすくなる |
| 実務 | プロジェクトで採用している規格に合わせやすくなる |
| エラー調査 | 規格の違いが原因になっていないか確認できる |
特に初心者に覚えておいてほしいのが、規格の違いはコンパイル結果にも関係することがあるという点です。
ソースコードそのものに問題がなくても、そのコードが利用している機能と、コンパイラに指定している規格が合っていなければ、警告やエラーにつながる場合があります。
そのため、
「C言語だから全部同じ」
ではなく、
「どの規格のC言語として書いているのか」
という視点を持つことが大切です。
C言語には長い規格の歴史がある
主要な流れを先に一覧で確認してみましょう。
C言語の主要な規格
| 呼び名 | 年 | 位置づけ | 初心者向けのイメージ |
|---|---|---|---|
| K&R C | 1978 | 標準化以前の初期C | C言語が広まる土台となった時代 |
| C89 | 1989 | ANSIによる標準 | C言語の共通ルールが正式に整理された |
| C99 | 1999 | 大きな改訂 | C言語をより実用的に使いやすくした |
| C11 | 2011 | 現代的な要求への対応 | 並列処理などへの対応が強化された |
| C17 | 2018 | C11の修正・整理 | 大きな追加より安定化を重視 |
| C23 | 2024 | 現在のISO C規格 | 新しい改善を取り込んだ現行規格 |
WG14の規格履歴では、C89、C90、C99、C11、C17、C23という流れが整理されています。C89は1989年のANSI規格で、その内容が1990年にISO規格C90として標準化されました。C99、C11、C17、C23へとその後も改訂が続いています。
ここで注意してほしいのが、呼び名に付いている数字とISO規格が出版された年が必ず完全に一致するとは限らないことです。
特に、
- C17 → ISO/IEC 9899:2018
- C23 → ISO/IEC 9899:2024
という関係は、初心者が混乱しやすいポイントです。
GCCではC17について、2017年にまとめられた改訂が2018年に公開された規格として説明されています。またC23についても、2023年版の改訂が2024年にISO/IEC 9899:2024として公開されたものとして扱われています。
したがって、
「C17なのに2018?」
「C23なのに2024?」
と疑問に思っても間違いではありません。
規格の通称と正式なISO規格の発行年には、このようなずれがあると覚えておくとよいでしょう。
図1:C言語の主要な規格の流れ

この図から分かること
C言語は、一度完成してそのまま使われ続けている言語ではありません。
K&R Cの時代から、標準化されたC89、機能が拡張されたC99、現代的な要求への対応が進んだC11、C11を整理したC17、そして現在公開されているC23へと改良が続いています。WG14ではC23の次にあたるC2yの策定も進められており、C言語の規格は現在も維持・発展しています。
この図を見るときには、
「どの規格が一番新しいか」
だけを見るのではなく、
それぞれの規格がどのような役割を持って登場したのか
を見ることが大切です。
C99やC11のように機能追加の意味合いが大きい規格もあれば、C17のように既存の規格を修正し、より明確にする意味合いが強い規格もあります。
K&R Cは標準化以前のC言語を理解する手がかり
C言語の歴史を振り返るとき、最初に登場する名前の1つがK&R Cです。
K&Rは、Brian KernighanとDennis Ritchieの姓の頭文字から取られています。
1978年に出版された書籍「The C Programming Language」は初期のC言語を広めるうえで大きな役割を持ち、WG14もC言語が1978年のKernighanとRitchieの書籍によって記述されたことをC標準の歴史として説明しています。
K&R Cの位置づけ
| 項目 | 内容 |
|---|---|
| 呼び名 | K&R C |
| K | Kernighan |
| R | Ritchie |
| 関係する書籍 | The C Programming Language |
| 時期 | 1978年 |
| 位置づけ | 正式なISO標準より前の初期C |
| 歴史上の意味 | 初期のC言語を広く共有する土台となった |
ここで重要なのは、K&R CをC89やC99とまったく同じ意味の「正式な国際規格」と考えないことです。
現在のようにISO/IEC 9899としてC言語の仕様が整理される以前には、開発者同士で共通して参照できる基準が必要でした。
そこで大きな影響を持ったのがK&Rの書籍です。
初心者の段階ではK&R Cの細かな書き方まで覚える必要はありません。
まず、
C言語には正式な標準化より前の時代があり、その時代から現在のC言語へつながっている
と理解すれば十分です。
C89でC言語の標準化が大きく前進した
C言語が広く使われるようになると、共通の仕様を明確にする必要性が高まりました。
そこで1989年にANSIによるC言語規格ANSI X3.159-1989が成立しました。
これが一般にC89またはANSI Cと呼ばれる規格です。
その後、1990年にはISO/IEC 9899:1990として国際標準化され、こちらはC90と呼ばれます。WG14の現在の規格履歴でも、C89とC90はこのように区別されています。
C89の意味
| 項目 | 内容 |
|---|---|
| 通称 | ANSI C、C89 |
| ANSI規格 | ANSI X3.159-1989 |
| 国際標準への展開 | 1990年のC90へつながる |
| 大きな意味 | C言語の共通仕様が正式に整理された |
| 学習上の意味 | 現在につながるC言語の基本的な土台となった |
標準化以前の状態では、処理系によって解釈の違いが大きいと、同じソースコードを別の環境へ持っていったときに問題が起こりやすくなります。
標準規格が作られることで、
「この規格に従うC言語なら、このルールに従う」
という共通の基準を持ちやすくなりました。
これはプログラマだけでなく、コンパイラを作る側にとっても重要です。
教材を作る場合にも、
「この教材はどのC言語を基準にしているか」
を明示できるようになります。
C89とC90はどう考えればよいのか
初心者向けの資料を読んでいると、
- C89
- ANSI C
- C90
という複数の呼び方が出てくることがあります。
ここで混乱しやすいので、整理しておきましょう。
C89は1989年にANSIが標準化したものです。
C90は、その内容をもとに1990年にISOの国際規格として公開されたものです。WG14は現在もC89をANSI X3.159-1989、C90をISO/IEC 9899:1990として別々に履歴へ掲載しています。
初心者の段階では、
C89で標準化が進み、その内容が国際標準C90へつながった
という大きな流れを理解しておけばよいでしょう。
GCCでもc89とc90はC言語の規格指定として扱われています。
C99はC言語をさらに実用的にした大きな節目
C89・C90から時間が経ち、C言語にも新しい時代の開発環境に合わせた改良が必要になりました。
そこで登場した大きな改訂がC99です。
ISO/IEC 9899:1999として1999年に公開され、GCCの公式文書でもC99として扱われています。
C99では、C89時代のC言語を基礎にしながら、より実用的にプログラムを書きやすくする方向で多くの改良が加えられました。
この段階では、細かな機能名をすべて覚える必要はありません。
まず、
C99はC89から大きく前進した重要な改訂
と理解しておきましょう。
C99の位置づけ
| 観点 | 内容 |
|---|---|
| 規格 | ISO/IEC 9899:1999 |
| 方向性 | C言語の実用性や記述力を高める |
| C89との関係 | それまでのC言語を土台に大きく拡張 |
| 学習上の意味 | 現在使われるC言語へ近づく重要な節目 |
| 古い環境への注意 | コンパイラによって対応状況を確認する必要がある |
C99を理解するときには、
「昔のC言語を捨てて新しい言語になった」
と考える必要はありません。
C言語としての基本を残しながら、時代に合わせて使いやすくした、と考えると分かりやすいでしょう。
C11では現代の開発を意識した整備が進んだ
C99の次に大きな節目となるのがC11です。
C11はISO/IEC 9899:2011として2011年に公開されました。ISOの規格ページでも2011年版として確認できます。
C11では、マルチスレッドなど現代的な開発環境を意識した仕組みが規格へ取り込まれ、C言語の標準として扱える範囲が広がりました。
C11の位置づけ
| 項目 | 内容 |
|---|---|
| 規格 | ISO/IEC 9899:2011 |
| 公開年 | 2011年 |
| 主な方向性 | 現代的な開発への対応 |
| 並列処理 | スレッドなどに関する仕組みを標準化 |
| 安全面 | より安全なプログラムを意識した仕組みを追加 |
| 学習上の意味 | C17につながる重要な基準 |
初心者の段階でスレッドの詳しい使い方まで学ぶ必要はありません。
ここで重要なのは、
C言語は昔の機能だけを維持しているのではなく、時代に応じた要求を取り入れながら規格を更新してきた
ということです。
C17はC11を整理した規格
この教材で特に重要になるのがC17です。
C17はISO/IEC 9899:2018として公開されています。ISOの規格ページでは2018年版として掲載され、WG14もC17をISO/IEC 9899:2018として整理しています。
C17の特徴は、大きな新機能を大量に追加した規格ではないことです。
GCCの公式文書では、C17はC11と基本的に同じで、欠陥修正と規格を識別する値の変更が中心であると説明されています。(GCC)
つまり、
C11を土台として、問題点を修正し、仕様を整理した規格
として見ると分かりやすいでしょう。
C17の特徴
| 項目 | 内容 |
|---|---|
| 通称 | C17 |
| ISO規格 | ISO/IEC 9899:2018 |
| 基礎 | C11 |
| 大きな方向性 | 修正・明確化 |
| 大規模な新機能 | 少ない |
| 学習上の特徴 | C11系の機能を安定した基準で学びやすい |
| この教材 | 基本的な学習基準として使用 |
C17について、
「C17なのに、なぜ2018なのか」
という疑問も出てくるでしょう。
GCCではC17を、2017年に準備された改訂が2018年にISO規格として公開されたものと説明しています。そのため、C17という通称とISO/IEC 9899:2018という規格番号の両方を見かけます。
この2つは別々のC言語ではありません。
C17とISO/IEC 9899:2018は、同じ世代のC規格を指している
と考えてください。
C23は現在公開されているISO C規格
C17の次に登場した大きな規格がC23です。
正式なISO規格はISO/IEC 9899:2024です。
ISOによると、ISO/IEC 9899:2024は2024年10月に公開され、現在のC言語の国際規格となっています。
C23の特徴
| 項目 | 内容 |
|---|---|
| 通称 | C23 |
| ISO規格 | ISO/IEC 9899:2024 |
| 規格上の位置 | C17の次の世代 |
| 方向性 | 記述方法や互換性などの現代的な改善 |
| GCCでの指定 | -std=c23 |
| 学習時の考え方 | C17を理解したあとで差分を学ぶ方法もある |
C23についても、
「C23なのに2024なのはなぜ?」
と思うかもしれません。
GCCではC23を2023年の改訂で、2024年にISO規格として公開されたものと説明しています。
ここでもC17と同じように、
- 通称としてのC23
- 正式規格としてのISO/IEC 9899:2024
という2つの表現が出てきます。
C23があるならC17を学ぶ意味はないのか
現在の規格がC23なら、
「最初からC23だけ学べばよいのではないか」
と思うかもしれません。
しかし、入門学習では必ずしも最新機能から覚える必要はありません。
C言語で最初に身につけたいのは、
- 変数
- データ型
- 演算子
- 条件分岐
- 繰り返し
- 関数
- 配列
- ポインタ
- メモリ
- コンパイル
といった基本です。
これらの土台を理解することが先です。
そのため、この教材ではC17を基準として基本を学び、そのうえで必要になった段階でC23との差を確認する方針にします。
これは、
「C23は学ばなくてよい」
という意味ではありません。
基本となる規格を1つ決めて学習を安定させ、その後で新しい規格との差分を見る
という学び方です。
C言語はC23で終わったわけではない
C23は2026年8月時点で公開済みの最新ISO C規格ですが、C言語の標準化作業そのものが終了したわけではありません。
WG14では次の規格をC2yという仮称で策定中です。GCCもc2yという規格モードを用意していますが、公式文書ではその対応を実験的かつ不完全と説明しています。
これはC言語が、
「昔完成して、もう変わらない言語」
ではなく、現在も規格の維持と改良が続いていることを表しています。
ただし、初心者がC2yまで追いかける必要はありません。
まずC17を中心に基本を学び、C23という現在の規格があることを知っておけば十分です。
図2:C89からC23までの役割の違い

この図から分かること
C言語の規格は、毎回同じ目的で更新されているわけではありません。
C89では標準化によって共通の基準が整えられ、C99では実用性や記述力を高める方向へ大きく改良されました。
C11では現代的な開発への対応が進み、そのC11を土台に問題点を修正したものがC17です。
そして、その次の大きな世代としてC23が公開されています。C23はISO/IEC 9899:2024として現在公開されているC言語規格です。
このように、
新機能を増やす規格
と
既存規格を整える規格
の両方があることが分かります。
したがって、数字が新しいからといって、必ずそれまでとは大きく違う言語になるわけではありません。
なぜこの教材ではC17を基準にするのか
ここは、この先の学習を進めるうえで大切な部分です。
この教材では、C言語の基本をC17を基準として学習します。
C17はC11を土台とし、主として欠陥修正を取り込んだ規格です。GCCでもC17をC11とほぼ同じ規格として扱い、-std=c17によって明示的に選択できます。
C17を学習基準にする理由
| 理由 | 初心者向けの説明 |
|---|---|
| C11を土台としている | 現代的なC言語の基本を学べる |
| 大規模な追加が少ない | 新機能の違いより基本文法へ集中しやすい |
| 仕様が整理されている | C11の修正を取り込んだ基準として扱える |
| GCCで指定できる | -std=c17で学習環境を明示できる |
| C23へ進みやすい | 基本を理解したあとで新しい規格との差を整理できる |
特に初心者の場合、いろいろな規格の機能を同時に覚えようとすると、
「これはC99なのか」
「こちらはC11なのか」
「C23ではどう変わったのか」
と規格の違いに気を取られてしまいます。
しかし、最初に必要なのは、規格の差分を覚えることではありません。
まず、
- プログラムの基本構造
- 変数
- データ型
- 条件分岐
- 繰り返し
- 関数
- 配列
- ポインタ
などをしっかり理解することです。
そこで学習基準をC17に固定しておけば、
この教材では基本的にC17として考える
という共通の土台を持てます。
「最新規格」と「学習に使う規格」は分けて考えてよい
初心者が混乱しやすいポイントなので、ここをもう少し詳しく整理しましょう。
2026年8月時点で公開済みの最新ISO C規格はC23です。ISOではISO/IEC 9899:2024が現行版として公開されています。
一方、この教材ではC17を基準とします。
これは矛盾ではありません。
たとえば、数学を学ぶときに最新の研究論文から始めるのではなく、まず基本的な計算や公式から学びます。
プログラミングでも同じです。
C23の存在を知ったうえで、
まずはC17という1つの安定した基準で基本を学ぶ
ことができます。
基本が理解できれば、あとからC23について、
「C17と何が違うのか」
という比較ができます。
この順番のほうが、新しい機能の意味も理解しやすくなります。
GCCでは規格を明示してコンパイルできる
GCCを使う場合、どのC言語規格としてソースコードをコンパイルするかをオプションで指定できます。
その代表的な指定が-stdです。
GCCの公式文書では、-stdによってC90、C99、C11、C17、C23などを選択できることが示されています。
たとえばC17としてコンパイルする場合は、次のように指定します。
gcc -std=c17 hello.c -o helloこのコマンドでは、
- gcc
- -std=c17
- hello.c
- -o
- hello
という要素があります。
GCCによるC17のコンパイル指定
| 部分 | 意味 |
|---|---|
| gcc | GCCのCコンパイラを実行する |
| -std=c17 | C17規格を指定する |
| hello.c | コンパイルするC言語のソースファイル |
| -o | 出力するファイル名を指定する |
| hello | 作成する実行ファイル名 |
ここで特に重要なのが-std=c17です。
これによって、
このソースコードをC17の規格を基準として扱う
ことをコンパイラへ伝えます。
GCCで指定できる主なC言語規格
GCCでは、主要なC言語規格を次のように指定できます。現在のGCC公式文書ではc90、c99、c11、c17、c23が規格指定として案内されています。
| 指定 | 意味 |
|---|---|
| -std=c90 | ISO C90としてコンパイルする |
| -std=c99 | ISO C99としてコンパイルする |
| -std=c11 | ISO C11としてコンパイルする |
| -std=c17 | ISO C17としてコンパイルする |
| -std=c23 | ISO C23としてコンパイルする |
この表を見ると、
「同じGCCでも、どの規格を使うか選べる」
ことが分かります。
これはとても重要です。
コンパイラが新しいからといって、常に最新規格だけでコンパイルしなければならないわけではありません。
古い規格を必要とするプロジェクトなら、その規格を指定できます。
学習用としてC17へ統一したい場合にも、-std=c17を指定できます。
c17とgnu17は同じではない
GCCでは、-std=c17だけでなく、-std=gnu17という指定もあります。
名前が似ているため、初心者は同じものだと思ってしまうかもしれません。
しかし、意味は少し違います。
GCCの公式文書では、c17はISO C17の規格を基準としたモード、gnu17はC17を土台にGNU拡張も利用できるモードとして説明されています。(GCC)
C17とGNU17の違い
| 指定 | 基準 | 特徴 |
|---|---|---|
| -std=c17 | ISO C17 | 標準Cを意識した学習に向く |
| -std=gnu17 | C17 + GNU拡張 | GCC独自の拡張機能も利用できる |
初心者向けの教材では、まず標準的なC言語を学ぶことが大切です。
そのため、この教材では基本的に-std=c17を使う考え方で進めます。
GNU拡張が便利な場面もありますが、最初から拡張機能へ依存すると、
「これは標準Cなのか」
「GCCだから使える機能なのか」
が分かりにくくなることがあります。
標準Cを理解してから、必要に応じてGNU拡張を学ぶほうが整理しやすいでしょう。
GCCの規格指定を省略するとどうなるのか
ここは、現在のGCCを使う場合に特に注意してほしいポイントです。
GCCでは、規格指定を何も書かなかった場合のデフォルト規格があります。
現在のGCC公式マニュアルでは、Cコードについて規格オプションを指定しない場合のデフォルトは-std=gnu23です。
つまり、
gcc hello.c -o helloと
gcc -std=c17 hello.c -o helloは、
規格指定という意味では同じ条件ではありません。
教材でC17を基準に学習するのであれば、-std=c17を明示しておくほうが、どの規格を使っているのか分かりやすくなります。
これは規格学習の大切なポイントです。
以前のGCCに関する古い資料では、別の規格がデフォルトとして説明されていることもあります。
そのため、インターネット上の古い解説を読むときには、
「この説明はどの時期のGCCを前提にしているのか」
にも注意するとよいでしょう。
規格を指定するメリット
学習時に規格を明示するメリットを整理してみましょう。
- 教材とコンパイラの基準を合わせられる
- 自分がどのC言語を使っているのか明確になる
- 新しい規格だけで使える機能を誤って利用しにくくなる
- 古い教材との違いを調べやすくなる
- コンパイルエラーの原因を考える材料になる
つまり、-std=c17は単なる暗記するオプションではありません。
学習するC言語のルールを明確にするための指定
と考えると理解しやすくなります。
規格が違うとコードが通らないことがある
C言語の基本的な部分は、多くの規格で共通しています。
そのため、
- 基本的な変数
- ifによる条件分岐
- forによる繰り返し
- whileによる繰り返し
- 基本的な関数
などを学んでいる段階では、大きな違いを感じないこともあります。
しかし、新しい規格で追加された機能や、新しい規格でルールが変わった部分を利用すると、規格指定によってコンパイル結果が変わることがあります。
そのため、
「昨日まで使えた書き方なのにエラーになった」
という場合には、ソースコードそのものだけでなく、
- 使用しているコンパイラ
- コンパイラのバージョン
- -stdで指定している規格
- GNU拡張を使っているか
なども確認するとよいでしょう。
図3:教材・ソースコード・GCC・C規格の関係

この図から分かること
C言語の規格は、歴史を覚えるためだけに存在するものではありません。
実際にソースコードをコンパイルするときにも関係します。
教材でC17を基準とするなら、
教材 → C17を基準にコードを書く → GCCで-std=c17を指定する → C17の規格を基準にコンパイルする
という関係を作れます。
GCCでは-std=c11、-std=c17、-std=c23などによって規格を明示でき、gnu17などを指定するとGNU拡張を含むモードになります。現在のGCCでは、規格を明示しないCコードのデフォルトはgnu23です。
このため、教材で使用する規格をはっきりさせたい場合には、-std=c17のように明示する意味があります。
古い教材ではC89やC99を見ることがある
C言語は長く使われているため、現在でも古い書籍やWebサイトを参考にする機会があります。
そのような資料では、
- ANSI C
- C89
- C90
- C99
といった規格名が登場することがあります。
古い規格だからといって、その教材がすべて役に立たないわけではありません。
変数、条件分岐、繰り返し、関数など、現在のC言語にもつながる基本的な考え方を学べる資料は数多くあります。
ただし、コードをそのまま利用するときには、
「どの規格を前提として書かれたコードなのか」
を見ることが大切です。
古いコードを見たときの考え方
古いC言語のコードを見たときに、現在の教材と書き方が違っていても慌てる必要はありません。
まず、
- どの規格の時代に書かれたコードか
- 現在の規格でも有効な書き方か
- コンパイラ独自の拡張ではないか
- 教材独自の書き方ではないか
を確認します。
C言語の規格の流れを知っていると、
「間違ったコードだから違う」
だけではなく、
「規格の世代が違うため、書き方に差があるのかもしれない」
という視点を持てるようになります。
これが規格について学ぶ実用的なメリットです。
最新のC23はどのように学べばよいのか
C23は、現在公開されているC言語のISO規格です。ISO/IEC 9899:2024として2024年10月に公開されています。
これからC言語を長く学習するのであれば、C23について知っておくことには意味があります。
ただし、最初からC23の変更点をすべて覚える必要はありません。
まずC17を基準として、
- C言語の基本構造
- 変数
- データ型
- 条件分岐
- 繰り返し
- 関数
- 配列
- ポインタ
- メモリ
などを学びます。
そのあとで、
「C23ではC17から何が変わったのか」
という順番で学習すると、変更点を比較として理解できます。
基礎がない状態で新機能だけを覚えるよりも、
以前の規格ではこうだったが、C23ではこう変わった
という形で学ぶほうが、規格改訂の意味も理解しやすくなります。
学習と実務では規格の選び方が違うこともある
学習では、教材側が規格を決めてくれる場合があります。
この教材ではC17を基準にします。
一方、実際の開発現場では、必ずしも自分の好みだけで規格を決めるわけではありません。
プロジェクトによって、
- 使用するコンパイラ
- 対応する機器
- 既存ソースコード
- 開発ルール
- 利用できる規格
などが決まっている場合があります。
その場合は、プロジェクトの基準に合わせます。
学習・実務での規格の考え方
| 場面 | 基本的な考え方 |
|---|---|
| この教材での入門 | C17を基準にする |
| 古い教材を読む | C89やC99の記法があることを意識する |
| C11のコードを読む | C17との関係を意識する |
| 最新規格を学ぶ | C23との差分を少しずつ確認する |
| GCCで学習する | -std=c17を明示する |
| 実務 | プロジェクトの規約やコンパイラに合わせる |
大切なのは、
常に一番新しい規格を選べば正解
という考え方ではありません。
目的に合った規格を選ぶことが重要です。
C17とC23の位置づけを混同しない
ここまでの内容で、初心者が特に覚えておきたい部分を整理してみましょう。
C17とC23は、どちらも重要なC言語規格ですが、位置づけが異なります。
C17とC23の考え方
| 観点 | C17 | C23 |
|---|---|---|
| ISO規格 | ISO/IEC 9899:2018 | ISO/IEC 9899:2024 |
| 世代 | C11の次 | C17の次 |
| 主な方向性 | C11の修正・明確化 | 新しい改善を含む改訂 |
| GCC指定 | -std=c17 | -std=c23 |
| この教材 | 基本の学習基準 | あとから差分を学ぶ対象 |
| 現在のISO規格か | 以前の規格 | 現行の公開規格 |
C17は現在の最新規格ではありません。
現在の公開済みISO C規格はC23です。
それでもC17を学習基準として使用できます。
「最新」と「学習基準」は別の観点だからです。
GCCのデフォルトにもバージョンがある
もう1つ覚えておきたいのが、コンパイラ自身も更新されるということです。
C言語にはC17やC23といった規格の世代がありますが、GCCにも複数のバージョンがあります。
そのため、
「GCCならいつでも同じ動作をする」
とは限りません。
現在のGCC公式マニュアルではCのデフォルトをgnu23としています。
一方で、古いGCCの解説を見ると、別のデフォルト規格が説明されていることがあります。
この違いがあるため、学習では規格を明示する方法を知っておくと安心です。
たとえば、この教材なら、
gcc -std=c17 hello.c -o helloとすることで、使用するGCCのデフォルトに任せるのではなく、
C17でコンパイルする
という意図を明確にできます。
c17とc18という表記を見かける場合もある
GCCの規格指定を調べていると、c17だけでなくc18という名前を見ることがあります。
GCCではc17とc18をC17規格の指定名として扱っています。さらにiso9899:2017やiso9899:2018という指定名も用意されています。
これはC17が2018年にISO/IEC 9899:2018として公開されたことに関係しています。
そのため、
- C17
- C18
- ISO/IEC 9899:2018
といった表現が出てきても、
「まったく別々の3種類のC言語がある」
と考えないようにしましょう。
この教材では表記を分かりやすく統一するため、基本的にC17と呼びます。
C23にはc2xという古い呼び方もある
C23が正式に完成する前には、次のC規格を表す仮称としてC2xという名前が使われていました。
現在のGCCではc23が正式な規格指定として用意されており、c2xは非推奨の別名として扱われています。
古い記事を見ると、
-std=c2xと書かれている場合があります。
これは、C23がまだ策定中だった時期の資料である可能性があります。
現在の教材でC23を指定する場合は、
-std=c23と考えると分かりやすいでしょう。
ここでも、規格の歴史を知っていることが古い情報を読む助けになります。
規格名だけを暗記する必要はない
K&R C、C89、C99、C11、C17、C23と並べると、覚えるものが多いように感じるかもしれません。
しかし、最初から年号や細かな違いをすべて暗記する必要はありません。
まずは次のような大きな流れを理解してください。
- K&R C
正式な国際標準化より前の初期Cを理解するための重要な存在。 - C89
C言語の標準化が大きく進んだ節目。 - C99
C言語をより実用的にする大きな改訂。 - C11
現代的な開発要求への対応を進めた規格。 - C17
C11の問題点を修正し、仕様を整理した規格。この教材の基準。 - C23
現在公開されているISO C規格。
WG14の現在の規格一覧では、C23の次にC2yが策定中として掲載されています。
この流れが理解できれば、規格について調べるときの地図を持った状態になります。
表や図は「規格の違い」を整理するために使う
C言語の規格は、文章だけを読んでいると数字の羅列に見えてしまいます。
そこで、表や図を見るときには役割を意識すると理解しやすくなります。
表と図の読み方
| 種類 | 役割 | 読むポイント |
|---|---|---|
| 規格一覧表 | 全体を把握する | 年と位置づけを見る |
| 規格別の表 | 個別の意味を理解する | 何を目的とした規格かを見る |
| タイムライン | 時系列を理解する | 左から右へ規格の流れを見る |
| 比較図 | 規格同士を比べる | 機能追加か修正中心かを見る |
| GCC設定図 | 規格を実際の操作へ結びつける | -stdと規格の対応を見る |
たとえば年表を見るときに、年号を全部暗記する必要はありません。
まず、
C89 → C99 → C11 → C17 → C23
という大きな流れをつかみます。
そのうえで、
C17はC11を修正した規格
C23はC17の次の大きな改訂
という関係を覚えると、全体を整理しやすくなります。
C言語の規格を知るとエラー調査にも役立つ
プログラムを学習していると、
「教材と同じように書いたのにコンパイルできない」
ということがあります。
このとき、すぐに自分のコードだけが間違っていると決めつける必要はありません。
確認するものとして、
- ソースコードの入力ミス
- コンパイラの種類
- GCCなどコンパイラのバージョン
- 指定されているC規格
- GNU拡張の有無
- 教材が前提としている規格
などがあります。
特にインターネットからコードをコピーした場合、そのコードがどのC規格を前提にしているか分からないことがあります。
規格の知識があると、
「もしかするとC17ではなくC23向けのコードなのではないか」
「これはGNU拡張を使っているのではないか」
という調べ方ができるようになります。
これは、単に規格名を暗記しただけでは得られない実用的な力です。
この教材では「C17」を共通のものさしにする
これからC言語を学習すると、
- 変数
- データ型
- 演算子
- 標準入出力
- 条件分岐
- 繰り返し
- 配列
- 関数
- ポインタ
など、さまざまな内容が登場します。
そのたびに規格の違いを細かく気にしていると、本来学ぶべきC言語の仕組みに集中しにくくなります。
そこで、この教材ではC17を共通の基準として扱います。
GCCを利用する場合には、
-std=c17という指定を使うことで、C17を基準にする意図を明確にできます。GCCはC17を正式に選択できる規格モードとして提供しています。
そして基本を身につけたあとでC23を見ると、
「新しいC言語だから何もかも違う」
のではなく、
C17で学んだ土台の上に、どのような変更が加えられたのか
という視点で理解できるようになります。
C言語の規格を学ぶ本当の目的は、C89、C99、C11、C17、C23という名前を順番に暗記することではありません。
自分がどの規格を基準にコードを書いているのかを理解し、教材・コンパイラ・ソースコードの関係を自分で判断できるようになることが大切です。
これから実際にC言語のコードを書くときも、
「これはC言語だから動く」
だけではなく、
「この教材ではC17を基準としていて、GCCにもC17を指定している」
というところまで意識できるようになると、より確かな理解につながっていきます。
今回の内容では、特に現在のGCCでは規格指定なしのデフォルトがgnu23になっている点を、古い教材との違いが出やすい重要事項として反映しています。GCC公式文書に基づく現在の仕様です。
