C言語では、変数名や関数名などに好きな名前を付けることができますが、
どんな文字でも使えるわけではありません。
命名には「使える文字」や「付け方のルール」があり、それを守らないとコンパイルエラーになります。
また、組み込み開発では複数人で同じコードを扱うため、統一された命名規則を持つことがとても重要です。
また、プロジェクトで統一された命名規則を設けることで、読みやすく、保守しやすいコードを書くことができます。
今回は、C言語の基本ルールと、開発でよく使われる書き方の慣例を紹介します。
命名規則の基本
まず、C言語で「名前(識別子)」を付ける際の基本的なルールを押さえましょう。
- 使用できる文字:英字(A〜Z, a〜z)、数字(0〜9)、アンダースコア(_)
- 先頭文字に数字は使えない
- 予約語(
if,for,int,returnなど)は使用できない - 大文字と小文字は区別される(
Countとcountは別扱い)
有効な名前:count, led_state , _flag
無効な名前:2count, return, total-value, sum value
命名規則の基本方針(読みやすさ・統一性)
次に説明するのは、「読みやすくするための慣習的なルール」です。
命名の目的は「後から読んでも意味がわかること」です。
しかし、組み込み開発では、可読性やエディタの表示幅、コーディング効率の観点から、名前を必要以上に長くするのは好ましくありません。
意味が伝わる範囲で短くまとめることが大切です。
命名で意識すべき基本方針は次の通りです。
意味が推測できる範囲での省略を許容する
Webアプリなどでは count や temperature と書くことが多いですが、
組み込みでは次のような省略形も一般的です。
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++;
}
}ループ変数も i や j ではなく、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など)は組み込みでは使用しない - キャメルケースも組み込みでよく使われる
- 定数は大文字+アンダースコアで区切り、マジックナンバーを避ける
- コメントで補足して、チーム全体で統一ルールを守る