忍者ブログ
IT関係の小作人労働の日々の日記です。 最近データベースが好きです。 インフラ構築、DB構築、アプリケーション開発・・・何でも屋です。 何でもできそうで、何にもできない。

【C言語入門】Macターミナルで解き明かす:コンパイラ「Clang」とC言語規格(C11/C17)の深い関係


ターミナルで `clang` と打ち込んでコンパイルしているとき、裏側では一体何が起きているのでしょうか。今回は、ツールとしてのコンパイラと、言語のルールである「規格」の関係、そして自分の環境の正体を暴く方法まで、まとめて解説します。

1. 料理人とレシピの関係:ClangとC言語規格

【 ここがポイント 】 C言語の学習において、コンパイラと規格は「料理人とレシピ」の関係に似ています。この違いを理解すると、エラーの原因や書き方のマナーがより鮮明に見えてきます。

Clang(料理人)
・Mac標準のコンパイラ。ソースコードを読み、CPUが実行できる形に翻訳する「実務担当」です。

C言語規格(レシピ)
・「C11」や「C17」といった、言語の書き方の公式ルールです。時代に合わせて更新されます。

2. C言語の主な規格(C99 / C11 / C17)

【 ここがポイント 】 C言語は1970年代に誕生しましたが、今も進化し続けています。特に重要なのが以下の3つです。

C99:1999年制定。変数の宣言をコードの途中で書けるようになるなど、便利になった世代。
C11:2011年制定。より高度な処理(並列処理など)への対応が強化されました。
C17:2018年制定。C11のバグ修正が中心の、現在最も「標準」として使われる安定したルール。

3. 実践:自分のMacの「デフォルト規格」を調べる

【 ターミナルの動き 】 自分のMacのコンパイラが、普段どの時代のレシピ(規格)を基準にしているかを確認してみましょう。`--version` よりもさらに深い情報を引き出すコマンドを使います。

# コンパイラの内蔵設定からバージョン情報を抽出する
% clang -dM -E -x c /dev/null | grep __STDC_VERSION__

[ 実行結果の例 ]
#define __STDC_VERSION__ 201710L

【 結果の読み方 】 この数値は、その規格が策定された年月(あるいはバージョン番号)を示しています。

201710LC17(最新のMacでの標準設定)
201112LC11
199901LC99

4. 応用:あえて規格を指定してビルドする

【 ターミナルの動き 】 特定のルールで厳格にチェックしたいときは、コンパイル時に `-std` オプションを付けます。

# C11のルールに従ってコンパイルする場合
clang -std=c11 hello.c -o hello

5. 理解度チェック!練習問題

【 チャレンジ 】 今回学んだ内容の復習です。コンパイル時に、特定のC言語規格(例:C11)に準拠させるための正しい指定方法はどれでしょうか?

# 記述例:
clang 【 空欄 】 hello.c -o hello

選択肢:
A. -ver=c11
B. -mode=c11
C. -std=c11
D. -rule=c11

正解と解説を見る

正解:C. -std=c11

「Standard(規格)」を意味する -std オプションを使います。これによって、コンパイラという「料理人」にどの「レシピ」を使うかを明示的に指示できます。

6. まとめ:やってみて分かったこと

単に「プログラムを動かす」だけでなく、背後にある「Clang」というツールの特性や、「C17(201710L)」という準拠規格を知ることで、自分が今どの時代の技術を使っているのかが鮮明になりました。この「環境への理解」こそが、トラブルに強いエンジニアへの第一歩です。

PR