0Pricing
C Academy · レッスン

#define定数

プリプロセッサ定数を使います。

「#define定数」はCoddyKit上の無料C Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。

#defineの働き

#defineは、コンパイル前にプリプロセッサがテキストへ置き換える名前であるマクロを作成する、プリプロセッサディレクティブです。

バッファサイズや上限値などの固定値に、読みやすい名前を付けるためによく使われます。

#define MAX_LEN 256

テキスト置換

マクロは純粋なテキスト置換です。MAX_LENが現れる場所では、プリプロセッサがその箇所を256に置き換えます。

型もメモリ領域もなく、コンパイラがコードを見る前に処理されます。

#include <stdio.h>
#define MAX_LEN 256
int main(void) {
    printf("%d\n", MAX_LEN);
    return 0;
}

セミコロンは付けない

#defineの末尾にセミコロンを付けるのは、よくある間違いです。

セミコロンも置換テキストの一部になり、原因の分かりにくいエラーを引き起こすことがあります。セミコロンは付けないでください。

#define PI 3.14159     /* correct */
#define BAD 10;        /* wrong: semicolon is substituted too */

浮動小数点定数の定義

マクロは、浮動小数点値を含むあらゆるリテラルに使えます。

ここでは、使用するたびにPIが円の面積の計算式へ置き換えられます。

#include <stdio.h>
#define PI 3.14159
int main(void) {
    double r = 2.0;
    printf("%.2f\n", PI * r * r);
    return 0;
}

配列サイズに使うマクロ

配列のサイズには、コンパイル時に値が分かっている必要があるため、マクロがよく使われます。

名前を使うことで、サイズを1か所で管理し、簡単に変更できます。

#include <stdio.h>
#define SIZE 5
int main(void) {
    int data[SIZE] = {1, 2, 3, 4, 5};
    printf("%d\n", data[SIZE - 1]);
    return 0;
}

式は必ず括弧で囲む

マクロが式に展開される場合は、括弧で囲んでください。

括弧がないと、より大きな式の中でマクロを使ったときに、演算子の優先順位によって意味が変わることがあります。

#define WIDTH (4 + 2)   /* good */
#define BADW 4 + 2       /* risky: 10 * BADW becomes 10*4+2 */

括弧が重要な理由

このプログラムで違いを確認できます。括弧がある場合はWIDTH全体が乗算されますが、ない場合は一部だけが乗算されます。

安全なバージョンは60を出力しますが、安全でない展開では異なる計算結果になります。

#include <stdio.h>
#define WIDTH (4 + 2)
int main(void) {
    printf("%d\n", 10 * WIDTH);
    return 0;
}

文字列マクロ

マクロは文字列リテラルを表すこともでき、固定メッセージやバージョン名に便利です。

引用符も含めて、テキストがそのまま置換されます。

#include <stdio.h>
#define APP_NAME "CoddyKit"
int main(void) {
    printf("Welcome to %s\n", APP_NAME);
    return 0;
}

#defineとconstの比較

マクロには型もアドレスもありませんが、const変数にはその両方があり、スコープにも従います。

型安全性とデバッグ時の可視性が必要な場合はconstを優先してください。配列サイズのようなコンパイル時定数には#defineを使います。

#define M_SIZE 10
const int c_size = 10;

定義解除とガード

#undefを使うとマクロを削除できます。マクロは、二重インクルードを防ぐヘッダーガードにも使われます。

ここでは、ヘッダーファイルの先頭で使われる典型的なガードパターンを示します。

#ifndef CONFIG_H
#define CONFIG_H
/* header contents here */
#endif

慣例的な命名

長年の慣例により、マクロ名はUPPER_CASEで記述します。

これにより、プリプロセッサ定数であることが見た目で分かり、通常の変数名との衝突も避けやすくなります。

#include <stdio.h>
#define BUFFER_SIZE 1024
int main(void) {
    printf("%d\n", BUFFER_SIZE);
    return 0;
}

理解度チェック

マクロについての理解度を確認しましょう。

まとめ

#defineは、プリプロセッサがテキストとして置換するマクロを作成します。マクロには型もセミコロンもメモリ領域もありません。

式は括弧で囲み、型安全な値にはconstを優先してください。配列サイズやヘッダーガードなど、コンパイル時に必要な場合にマクロを使います。

よくある質問

「#define定数」レッスンは無料ですか?

はい。「#define定数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。

「#define定数」で何を学びますか?

プリプロセッサ定数を使います。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「#define定数」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. enumを定義する
  2. enumの値と範囲
  3. const変数
  4. #define定数
← C Academyに戻る