読者です 読者をやめる 読者になる 読者になる

テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

(macro-of-inline report) staticなリネームは考慮しなくていい

以下のようなリネームがあった場合, gの呼び出しはマクロ化する必要がない.

static inline void f(void) { puts("hoge"); }
typedef void(*func_t)(void);
static  func_t g = f;

理由:

  • マクロ化する関数の集合は, 同一ファイル内のFuncDefである.
  • gは, FuncDefではない.
  • もし, 単にgが呼ばれた場合は, これは単なる関数呼び出しとする(fはマクロ化されているが, 呼び出しもとの変形はしない)
  • 仮に関数内のリネームでgが生成された場合は, やはりこいつについては, 変形しなくていいことは先ほどの検討より.

まとめると,

ある時点でのマクロ化対象関数は,

  • 同一ファイル内のFuncDefの集合
  • に対して, いくらかの前処理を加えて弾く.
  • 関数内での呼び出しについてその時点でのリネームを差し引いたもの

ということにして良い. ここでもやはり, 変換前の関数定義を残すことが前提として使われている.