C言語の基本|識別子の命名ルール

名前に意味を持たせれば、コードはもっと伝わりやすくなる。C言語の命名ルールを覚えて、迷わず読めるプログラムを書こう。

C言語では、変数や関数などに名前を付けながらプログラムを作ります。たとえば、商品の個数を保存する変数なら item_count、結果を表示する関数なら print_result のような名前を付けられます。

こうしたプログラム上の名前を、識別子といいます。

識別子は、決められた文法を守っていれば自由に作れます。ただし、どんな名前でも読みやすくなるわけではありません。a や x のような短い名前ばかりでは、その値が何を表しているのか分かりにくくなってしまいます。

反対に、役割が伝わる名前を付けておけば、処理の内容を追いやすくなります。数日後に自分のコードを読み返すときにも、名前が大きな手がかりになります。

ここでは、次の内容を中心に見ていきます。

  • 識別子として使える文字
  • 識別子の先頭に使える文字
  • 大文字と小文字の違い
  • 予約語を使えない理由
  • スネークケースなどの命名スタイル
  • 意味が伝わる名前の考え方
  • 識別子と数値定数の違い

まずは文法上のルールを覚え、そのあとで読みやすい名前を考えていきましょう。

識別子とはプログラム内で使う名前

識別子は、プログラムの要素を見分けるための名前です。変数名だけを指す言葉ではありません。

主に、次のような場所で使われます。

  • 変数名
  • 関数名
  • 配列名
  • 構造体などの名前
  • typedefで作る型名
  • マクロ名

たとえば、次のコードでは item_countとshow_resultが識別子です。

int item_count;
void show_result(void);

intやvoidは、データ型などを表すためにC言語が用意している予約語です。そのため、自由に付けた識別子ではありません。

識別子と予約語を見分けると、コードの中で「自分で決めた名前」と「C言語で意味が決まっている言葉」を整理しやすくなります。

図1:識別子がプログラムの要素に名前を付ける仕組み

この図から分かること

識別子は、変数だけでなく、関数や配列、型、マクロなどにも使われます。プログラム内の要素に分かりやすい名前を付けることで、それぞれの役割を見分けられるようになります。

識別子に使える文字

C言語の基本的な識別子には、次の文字を使用できます。

  • 英小文字のaからz
  • 英大文字のAからZ
  • 数字の0から9
  • アンダースコアの_

たとえば、次の名前は識別子として使用できます。

count
total_amount
item2
user_name
MAX_SIZE

日本語を識別子に使用できる処理系もありますが、コンパイラや文字コードによる違いを避けるため、学習段階では英字、数字、アンダースコアを使うと安心です。

識別子の先頭に数字は使えない

数字は識別子の途中や末尾には使えますが、先頭には使えません。

item2
score2026

これらは正しい識別子です。一方、次の名前は先頭が数字なので使用できません。

2item
2026score

数字から始まる並びは数値として解釈される可能性があるため、識別子の先頭には英字またはアンダースコアを使います。

識別子使用できるか理由
count使用できる英字から始まっている
total_amount使用できる英字とアンダースコアで構成されている
item2使用できる数字が先頭ではない
2item使用できない数字から始まっている
total-price使用できないハイフンが含まれている
user name使用できない空白が含まれている

ハイフンは減算を表す演算子として扱われます。そのため、total-priceは1つの名前ではなく、totalからpriceを引く式のように解釈されます。

複数の単語をつなげたい場合は、total_priceのようにアンダースコアを使いましょう。

先頭のアンダースコアには注意しよう

文法上、識別子はアンダースコアから始めることもできます。

_temp
_count

ただし、C言語ではアンダースコアから始まる名前の一部が、処理系や標準ライブラリのために予約されています。

特に、次のような名前は自分で付けないほうが安全です。

  • アンダースコアと大文字で始まる名前
  • アンダースコアが2つ続く名前
  • ファイル全体で使われる、アンダースコアから始まる名前
_MAX_SIZE
__temporary

初心者のうちは、識別子を英小文字から始めると迷いにくくなります。

temporary_value
item_count

大文字と小文字は別の名前になる

C言語では、英字の大文字と小文字を区別します。

int item_count;
int Item_Count;
int ITEM_COUNT;

この3つは、すべて異なる識別子です。

ただし、文法上は使えても、よく似た名前を同じ場所で使用すると読み間違いが起きやすくなります。大文字と小文字だけで役割を分けるのではなく、意味そのものが異なる名前を付けるのがおすすめです。

int current_count;
int maximum_count;

このように書けば、現在の個数と最大個数の違いが名前から分かります。

予約語は識別子に使えない

予約語とは、C言語の文法ですでに役割が決められている単語です。

たとえば、intは整数型、returnは関数から処理を戻すために使われます。コンパイラはこれらを文法の一部として読み取るため、変数名や関数名にはできません。

int int;
int return;

このような宣言はコンパイルエラーになります。

代表的な予約語を分類すると、次のようになります。

分類予約語の例
型に関係するものint、char、double、void
条件や繰り返しif、else、switch、for、while
記憶域や修飾static、extern、const、volatile
その他の処理sizeof、typedef、return

C11では、次のような予約語も追加されています。

  • _Alignas
  • _Alignof
  • _Atomic
  • _Generic
  • _Noreturn
  • _Static_assert
  • _Thread_local

入門用のプログラムで見かける機会は多くありませんが、識別子としては使えません。

なお、classはC言語の予約語ではないため、Cのコードでは識別子として使用できます。ただし、C++では予約語です。CとC++の両方で使う可能性があるコードでは、別の名前を選ぶほうが分かりやすいでしょう。

予約語に別の単語を加えた名前は使える

予約語そのものは識別子にできませんが、ほかの単語と組み合わせれば別の識別子になります。

int return_code;
char input_char;
int integer_value;

return_codeはreturnとは異なる名前です。input_charもcharそのものではないため、問題なく使えます。

名前を工夫するときは、予約語を避けるだけでなく、何を表しているのかが分かる形にしましょう。

使用できない名前使用できる名前の例表している内容
intinteger_value整数の値
charinput_char入力された文字
returnreturn_code処理結果を表すコード
whilewaiting_time待ち時間

図2:使用できる識別子と使用できない識別子

この図から分かること

識別子には、自由に名前を付けられる範囲と、守らなければならない文法があります。数字から始める名前、ハイフンや空白を含む名前、予約語と同じ名前は使用できません。

命名ルールと命名スタイルは別のもの

識別子を考えるときは、ルールとスタイルを分けて考えることが大切です。

  • 命名ルールは、コンパイルできる名前を作るための文法
  • 命名スタイルは、コードを読みやすくするための表記方法

たとえば、item_countとitemCountはどちらも文法上は正しい識別子です。ただし、単語の区切り方が異なります。

プロジェクト内で両方を混ぜると見た目が不ぞろいになるため、どちらかのスタイルに統一するのがおすすめです。

スネークケース

スネークケースは、英単語を小文字で書き、単語の間をアンダースコアでつなぐスタイルです。

int item_count;
double total_amount;
int get_user_age(void);

単語の区切りが分かりやすく、C言語では変数名や関数名によく使われます。

スネークケースの主な特徴は次のとおりです。

  • 複数の単語を見分けやすい
  • 変数名や関数名に使いやすい
  • C言語のコードになじみやすい
  • 長い名前ではアンダースコアが多くなる

特別な命名方針が決まっていなければ、学習中はスネークケースを選ぶと統一しやすいでしょう。

大文字スネークケース

すべての英字を大文字にして、単語をアンダースコアでつなぐ書き方です。

#define MAX_ITEMS 100
#define DEFAULT_PRICE 500

C言語では、主にマクロ名で使われます。通常の変数と見た目がはっきり異なるため、コードを読んだときにマクロだと気づきやすくなります。

用途命名スタイル
変数名小文字のスネークケースitem_count
関数名小文字のスネークケースprint_result
マクロ名大文字のスネークケースMAX_ITEMS

constを付けた変数を大文字にするかどうかは、プロジェクトの方針によって異なります。大切なのは、途中で命名方法を変えず、一貫した書き方を続けることです。

キャメルケース

キャメルケースは、最初の単語を小文字で始め、2語目以降の先頭を大文字にするスタイルです。

int itemCount;
double totalAmount;

アンダースコアを使わないため、見た目が短くまとまります。JavaやC#などでよく見られる書き方ですが、C言語で使っても文法上の問題はありません。

スタイルC言語での主な使われ方
スネークケースitem_count変数名や関数名でよく使われる
大文字スネークケースMAX_ITEMSマクロ名でよく使われる
キャメルケースitemCount使用できるが、Cでは比較的少なめ

どのスタイルを選んでも構いませんが、同じプログラムの中では統一しましょう。

意味が分かる名前を付けよう

文法的に正しいだけでは、読みやすい識別子とはいえません。その名前が何を表しているのか、読み手に伝わることが大切です。

次の宣言では、変数の役割が名前から分かりません。

int a;
int b;
int c;

意味を具体的にすると、コードの目的が読み取りやすくなります。

int item_count;
int unit_price;
int total_price;

名前を見るだけで、商品の個数、単価、合計金額を扱う変数だと予想できます。

略しすぎないようにしよう

短い名前は入力しやすい一方で、意味が伝わりにくくなることがあります。

分かりにくい名前分かりやすい名前
amtamount
cntcount
usruser
ttltotal
tmptemporary_value

countやmaxなど、広く使われていて意味を理解しやすい表現もあります。そのため、すべての省略を避ける必要はありません。

大切なのは、初めてコードを読む人が意味を推測できるかどうかです。迷う場合は、少し長くなっても単語を省略せずに書くとよいでしょう。

名前に役割や単位を含めよう

同じ種類の値が複数ある場合は、役割や単位を名前に含めると分かりやすくなります。

int elapsed_seconds;
int distance_meters;
double temperature_celsius;

elapsedだけでは何の経過量か分かりませんが、elapsed_secondsなら秒単位の経過時間だと判断できます。

名前を考えるときは、次の点を確認してみましょう。

  • 何を表す値なのか
  • 個数、金額、時間など、どの種類の情報なのか
  • 単位を付けたほうが誤解を防げるか
  • 現在値、最大値、合計値などの役割があるか
int current_score;
int maximum_score;
int total_score;

役割を加えることで、似たデータも区別しやすくなります。

同じ意味には同じ単語を使おう

同じ意味の値に、count、number、quantityなどの異なる単語を混在させると、何か違いがあるように見えてしまいます。

int item_count;
int user_number;
int order_quantity;

それぞれ本当に異なる意味で使っているなら問題ありません。ただし、すべて単純な個数を表しているなら、countにそろえると関係を理解しやすくなります。

int item_count;
int user_count;
int order_count;

使う英単語をそろえることも、命名スタイルの一貫性につながります。

商品の購入金額と登録上限を表示するプログラム

ファイル名:4_7_1.c

#include <stdio.h>

#define MAX_PRODUCTS 8

int main(void)
{
    /* 変数名は小文字のスネークケースで統一する */
    int product_count = 4;
    int unit_price = 180;

    /* 商品の合計金額を計算する */
    int total_price = product_count * unit_price;

    /* 商品の購入情報を表示する */
    printf("購入する商品数: %d 個\n", product_count);
    printf("商品の単価: %d 円\n", unit_price);
    printf("合計金額: %d 円\n", total_price);

    /* 大文字スネークケースのマクロを表示する */
    printf("登録できる商品の上限: %d 個\n", MAX_PRODUCTS);

    return 0;
}
実行結果の例
購入する商品数: 4 個
商品の単価: 180 円
合計金額: 720 円
登録できる商品の上限: 8 個

このプログラムでは、通常の変数名を小文字のスネークケースにそろえています。

int product_count = 4;
int unit_price = 180;
int total_price = product_count * unit_price;

product_countは商品の個数、unit_priceは商品の単価、total_priceは合計金額を表します。変数の役割が名前に表れているため、コメントを読まなくても計算内容を推測できます。

次の式も、具体的な識別子によって意味が伝わりやすくなっています。

int total_price = product_count * unit_price;

この式では、商品の個数と単価を掛けて合計金額を求めています。仮にa、b、cという名前を使うと、同じ計算でも目的が分かりにくくなります。

マクロ名には、大文字のスネークケースを使っています。

#define MAX_PRODUCTS 8

MAX_PRODUCTSという名前から、商品の最大数を表していることが分かります。さらに、大文字で書かれているため、通常の変数ではなくマクロであることも見分けやすくなっています。

このように、名前の意味と見た目のスタイルを組み合わせると、コードの構造を読み取りやすくできます。

スタイルを混在させないようにしよう

次の識別子は、個別に見ればどれも文法上の問題はありません。

int item_count;
int totalAmount;
int MAXVALUE;

しかし、スネークケース、キャメルケース、大文字だけの名前が混在しています。さらに、MAXVALUEが変数なのかマクロなのかも見た目だけでは判断しにくい状態です。

次のように統一すると、役割が伝わりやすくなります。

int item_count;
int total_amount;
#define MAX_VALUE 100

C言語を学び始めた段階では、次の方針が使いやすいでしょう。

  • 変数名は小文字のスネークケースにする
  • 関数名も小文字のスネークケースにする
  • マクロ名は大文字のスネークケースにする
  • 名前には意味の分かる英単語を使う
  • 略語は必要な場合だけ使う
  • 同じ意味には同じ単語を使う

これはC言語の文法として強制される決まりではありません。コード全体の見た目を整え、読み手の負担を減らすための方針です。

識別子と数値定数を区別しよう

C言語のコードには、名前を表す識別子だけでなく、値そのものを表す定数も登場します。

int item_count = 123;

この中では、それぞれの要素が次の役割を持っています。

表記種類意味
int予約語整数型を指定する
item_count識別子変数に付けた名前
123整数定数変数に入れる値

item_countには識別子の命名ルールが適用されます。一方、123には整数定数の表記ルールが適用されます。

名前の書き方と数値の書き方は、別のルールとして整理しましょう。

16進浮動小数点定数は識別子ではない

16進浮動小数点定数は、16進数を利用して浮動小数点数を書く方法です。C99以降のC言語で使用できます。

たとえば、次の表記があります。

0xa3.f2p-10

これは識別子ではなく、数値定数です。英字が含まれていますが、変数名や関数名ではありません。

16進浮動小数点定数には、次のルールがあります。

  • 先頭を0xまたは0Xにする
  • 仮数部を16進数で記述する
  • 小数点を使用できる
  • 指数部にはpまたはPを使う
  • 指数部は2の何乗を掛けるかを表す
  • 指数部は省略できない

0xa3.f2p-10の仮数部はa3.f2で、指数部はp-10です。

仮数部は、次のように読み取れます。

10×161 + 3×160 + 15×16-1 + 2×16-2

さらにp-10があるため、この値に2のマイナス10乗を掛けます。

(10×161 + 3×160 + 15×16-1 + 2×16-2)×2-10

10進数の指数形式ではeやEを使いますが、16進浮動小数点定数ではpやPを使う点に注意しましょう。

表記種類
item_count識別子
12310進整数定数
0x7B16進整数定数
1.25e-310進浮動小数点定数
0xa3.f2p-1016進浮動小数点定数

16進浮動小数点定数は、入門段階で頻繁に使うものではありません。数値のビット表現や再現性を意識する処理などで見かけることがあります。

まずは、英字を含んでいても0xから始まりpによる指数部を持つ表記は、識別子ではなく数値定数だと見分けられれば十分です。

図3:識別子・予約語・数値定数の見分け方

この図から分かること

コードに英字や数字が登場しても、すべてが識別子になるわけではありません。intは予約語、item_countは識別子、123や0x7B、0xa3.f2p-10は数値定数です。それぞれに異なる表記ルールが適用されます。

読み手を意識して名前を決めよう

識別子を決めるときは、コードを書いている現在の自分だけでなく、そのコードをあとから読む人を意識することが大切です。

名前を付ける前に、次の点を考えてみましょう。

  • 名前だけで役割を推測できるか
  • 何を数えている値なのか分かるか
  • 単位を付けたほうが安全ではないか
  • ほかの識別子と表記が統一されているか
  • 略しすぎていないか
  • 必要以上に長くなっていないか

たとえば、nよりもitem_countのほうが具体的です。ただし、次のように情報を詰め込みすぎると、かえって読みにくくなります。

current_logged_in_user_total_item_count_for_screen

必要な意味を残しながら、簡潔な名前に整えるとよいでしょう。

display_item_count

短い名前が常に悪いわけではありません。小さな繰り返し処理で使うiなど、役割が明らかな場面では短い名前が自然なこともあります。

一方、複数の処理で長く使う変数や、金額、時間、件数などの重要なデータには、意味が伝わる名前を付けるのがおすすめです。

最初から完璧な名前を思いつく必要はありません。まずは文法上のルールを守り、スネークケースなどのスタイルを統一し、名前から役割を想像できるようにするところから始めてみてください。