プログラミングなどなど

プログラミングに関係しそうな内容を

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のまま残っています。