GCC:-includeを使用したマクロ展開制御
C言語の関数単体テストを作成している際に関数形式マクロの展開を調整したいと思う部分が出てきました。使用していたコンパイラはGCCでマニュアルを見るとマクロの読み込みを制御するオプション(-include)がありましたので、使ってみました。
使用したのは以下のソースになります。
サンプルソース
macro.h
関数形式マクロが定義されているヘッダファイル
#ifndef __MACRO_H__ #define __MACRO_H__ #include <stdio.h> #define LOG(fmt, ...) printf("%s, %s, %d : " fmt, __func__, __FILE__, __LINE__, ##__VA_ARGS__) #endif
func.c
関数形式マクロを利用するモジュール
#include "macro.h" #include "func.h" int square(int x) { int ret = x * x; LOG("x = %d, x**2 = %d\n", x, ret); return ret; }
func.h
#ifndef __FUNC_H__ #define __FUNC_H__ int square(int); #endif
普通にプリプロセスを通した場合
$ gcc -E func.c : int square(int x) { int ret = x * x; printf("%s, %s, %d : " "x = %d, x**2 = %d\n", __func__, "func.c", 7, x, ret); return ret; }
普通にプリプロセスを通すとLOGが展開されてprintfになっていますが、
このprintf展開をfunc.c, func.hを変更せずにどうにかLOGのままにしたい。
GCCのオプションを調べると-includeが使えそうでした。
以下のようなテスト向けのヘッダファイルを用意してプリプロセスを行ってみます。
test.h
#ifdef LOG #undef LOG #endif
GCC -includeオプション使用
$ gcc -Wall -E -include macro.h -include test.h func.c : int square(int x) { int ret = x * x; LOG("x = %d, x**2 = %d\n", x, ret); return ret; }
LOGのまま残っています。