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
は宣言されていません」という意味になります。
つまり#undef
でONE
を除去しているので参照できないということですね。
マクロを再定義する
一度定義したマクロは「undef」で除去すると再び「define」で再定義できるようになります。
#include <stdio.h>
#define ONE 2
#undef ONE
#define ONE 1
int main(void) {
printf("%d\n", ONE); // 1
return 0;
}
↑の場合、まちがってONE
を2
で定義しています。
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でマクロを除去しよう