ユーニックス総合研究所

  • home
  • archives
  • c-define-saiteigi

C言語のdefineで再定義する方法【undef, マクロの除去と再定義】

  • 作成日: 2022-06-23
  • 更新日: 2023-12-25
  • カテゴリ: C言語

C言語のdefineで再定義する方法

C言語ではマクロを定義するプリプロセッサ指令に「define」というのがあります。
これを使うとマクロを定義することができます。
マクロ定数だったりマクロ関数だったりです。

この定義したマクロを再定義するにはどうしたらいいのでしょうか?
これは結論を言うと「undef」して再度「define」をします。

この記事ではdefineで再定義する方法について解説していきます。

関連記事

目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
明快!C言語のcontinue文の使い方

目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
明快!C言語のcontinue文の使い方

目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】

defineでマクロを定義する

まずおさらいとしてdefineでマクロを定義する方法について見てみます。
たとえばマクロ定数ONEを定義する場合は↓のようなコードを書きます。

#define ONE 1  

このようにマクロ定数を定義すると↓のようにコードの中で定数を参照することができます。

#include <stdio.h>  

#define ONE 1  

int main(void) {  
    printf("%d\n", ONE);  // 1  
    return 0;  
}  

マクロを除去する

一度定義したマクロは「undef」で除去することができます。
たとえば先ほどの例で言うとONEというマクロ定数は↓のようにすると除去できます。

#include <stdio.h>  

#define ONE 1  
#undef ONE  

int main(void) {  
    printf("%d\n", ONE);  // ?  
    return 0;      
}  

↑のコードをコンパイルするとgccコンパイラでは↓のようなエラーになります。

error: ‘ONE’ undeclared (first use in this function)  

↑のエラーは「ONEは宣言されていません」という意味になります。
つまり#undefONEを除去しているので参照できないということですね。

マクロを再定義する

一度定義したマクロは「undef」で除去すると再び「define」で再定義できるようになります。

#include <stdio.h>  

#define ONE 2  
#undef ONE  
#define ONE 1  

int main(void) {  
    printf("%d\n", ONE);  // 1  
    return 0;  
}  

↑の場合、まちがってONE2で定義しています。
ONE#undefして再度#define ONE 1で定義しています。

↑のコードをコンパイルして実行すると出力結果は「1」になります。

マクロ関数の再定義もできる

defineはマクロ関数を定義することもできます。
マクロ関数とは↓のようなマクロのことです。

#define DECL(type, var, val) type var = val;  

↑のマクロ関数は変数を定義する時に使えるマクロで↓のように使います。

#include <stdio.h>  

#define DECL(type, var, val) type var = val  

int main(void) {  
    DECL(int, x, 123);  

    printf("%d\n", x);  // 123  

    return 0;  
}  

このマクロ関数は正直あまり使い道はありませんがマクロ関数の例としては面白いと思います。
で、これを再定義する場合は同様に#undefでマクロを除去します。
そして#defineで再定義します。

#include <stdio.h>  

#define DECL(type, var, val) type var = val  
#undef DECL  
#define DECL(type, var) type var = 0  

int main(void) {  
    DECL(int, x);  

    printf("%d\n", x);  // 0  

    return 0;  
}  

↑の場合、一度定義したDECL#undef DECLで除去しています。
そのあとに#define DECL(...)とやって再定義しています。

↑のコードをコンパイルして実行すると出力結果は「0」になります。

undefは未定義のマクロに使うとどうなるか?

未定義のマクロundefを使ってみましょう。

#undef ONE  

int main(void) {  
    return 0;  
}  

↑のコードをコンパイルすると特にエラーもなく実行できます。
このようにundefは未定義のマクロに対しても使うことができます。

おわりに

今回はC言語のdefineで定義したマクロを再定義してみました。
マクロの再定義はわりとよく行いますので覚えおくと損はないかと思います。

🦝 < マクロは再定義できる

🐭 < undefでマクロを除去しよう