C言語

命名規則や書き方ルール(変数・関数・定数など)

C言語では、変数名や関数名などに好きな名前を付けることができますが、
どんな文字でも使えるわけではありません。
命名には「使える文字」や「付け方のルール」があり、それを守らないとコンパイルエラーになります。

また、組み込み開発では複数人で同じコードを扱うため、統一された命名規則を持つことがとても重要です。

また、プロジェクトで統一された命名規則を設けることで、読みやすく、保守しやすいコードを書くことができます。

今回は、C言語の基本ルールと、開発でよく使われる書き方の慣例を紹介します。

命名規則の基本

まず、C言語で「名前(識別子)」を付ける際の基本的なルールを押さえましょう。

  • 使用できる文字:英字(A〜Z, a〜z)、数字(0〜9)、アンダースコア(_)
  • 先頭文字に数字は使えない
  • 予約語(if, for, int, returnなど)は使用できない
  • 大文字と小文字は区別される(Countcount は別扱い)

有効な名前:count, led_state , _flag

無効な名前:2count, return, total-value, sum value

命名規則の基本方針(読みやすさ・統一性)

次に説明するのは、「読みやすくするための慣習的なルール」です。

命名の目的は「後から読んでも意味がわかること」です。
しかし、組み込み開発では、可読性やエディタの表示幅、コーディング効率の観点から、名前を必要以上に長くするのは好ましくありません。
意味が伝わる範囲で短くまとめることが大切です。

命名で意識すべき基本方針は次の通りです。

意味が推測できる範囲での省略を許容する

Webアプリなどでは counttemperature と書くことが多いですが、
組み込みでは次のような省略形も一般的です。

cnt(count)、tmp(temporary)、num(number)など

これらは多くの現場で慣習的に使われており、十分に意味が伝わります。
ただし、誰もわからない独自略語は避けましょう。

int motor_cnt;    // OK:モーターのカウント数
int sensor_tmpr;  // OK:センサー温度(temperature)
int t;            // NG:何の値かわからない

「一般的に通じる略語」はOK、「独自略語」はNG。
プロジェクト内で略語表を共有すると統一しやすくなります。

命名スタイル(スネークケースとキャメルケース)

C言語では、単語を繋げるときに「スネークケース」または「キャメルケース」のどちらかを使います。

スタイル書き方
スネークケース単語を _ で区切るled_status, sensor_value
キャメルケース単語の先頭を大文字にするledStatus, sensorValue

どちらを使っても構いませんが、プロジェクト内で統一することが大切です。
一部がスネークケース、一部がキャメルケースだと非常に読みにくくなります。

変数名・関数名のルール

変数は、どの範囲(スコープ)で使われるかによって命名方針が異なります。
スコープごとに整理して考えるのがポイントです。
ただし、スコープに関わない命名方針もあるため、そちらを最初に紹介します。

基本命名ルール

種類命名の始まり命名例備考
変数名小文字で始めるsensorValue, motor_cnt, statusFlag小文字始まりはデータを表すことを示す
関数名大文字で始めるSensorRead(), Motor_Start()大文字始まりは処理・動作を表すことを示す
定数・マクロ名すべて大文字MAX_COUNT, TIMEOUT_MS一目で定数とわかるようにする

ローカル変数(関数内でのみ使用)

関数内だけで使う変数は短くても構いませんが、
何を表しているかがわかる名前を付けることが大切です。
特に組み込み開発では、「i」「j」などの1文字変数は禁止している現場が多くあります。
ループカウンタにも意味のある名前を付けましょう。

void Motor_Update(void)
{
    int motorIndex;
    int motorCnt;
    
    for (motorIndex = 0; motorIndex < MAX_MOTOR_COUNT; motorIndex++) {
        motorCnt++;
    }
}

ループ変数も ij ではなく、sensorIndex, motorNo, retryCount のように、
何を数えているかがわかる命名にしましょう。

static変数・static関数(モジュール内(ファイル内)限定)

static 指定された関数や変数は、そのファイル内だけで使われます。
外部に公開しないため、モジュール名を付ける必要はありません。

// sensor.c
static int count;

static void update(void)
{
    count++;
}

void Sensor_Update(void)
{
    update();  // 内部処理専用関数
}

このように、モジュール内だけで完結する処理は
「短く、シンプルに」命名するのが原則です。

グローバル変数・外部公開関数

他のファイルから参照される変数や関数は、モジュール名を接頭辞として付けます。

// sensor.c
int Sensor_Count;
float Sensor_GetTemperature(void);

// motor.c
int Motor_Count;
void Motor_Start(void);

これにより、Motor_Count がどのモジュールに属する変数なのかが明確になり、
他のファイルとの衝突も防げます。

定数・マクロのルール

定数やマクロは変更されない値を表すため、他の変数と区別しやすいようにすべて大文字で書きます。
単語の区切りには「_」を使うのが一般的です。

#define MAX_COUNT   100
#define TIMEOUT_MS  500
#define LED_ON      1
#define LED_OFF     0

また、意味の分からない数値(マジックナンバー)を直接書くのは避け、
定数名に置き換えることでコードの意図が明確になります。

// NG
if (time > 500) { ... }

// OK
if (time > TIMEOUT_MS) { ... }

まとめ

  • C言語の識別子には使える文字の制限がある
  • 意味が伝わる範囲での略語はOK(cnt, tmpr, sts など)
  • グローバル変数・外部関数にはモジュール名を付ける
  • staticやローカル変数は短く簡潔に
  • 一文字変数(i, jなど)は組み込みでは使用しない
  • キャメルケースも組み込みでよく使われる
  • 定数は大文字+アンダースコアで区切り、マジックナンバーを避ける
  • コメントで補足して、チーム全体で統一ルールを守る

-C言語