C 言語のマクロで関数をオーバーライド
マクロで関数をオーバーライド。
#include <stdio.h> void foo() { printf("foo\n"); } #define foo() printf("FOO\n") int main(int argc, char *argv[]) { foo(); #undef foo foo(); return 0; }
上記を実行すると:
FOO foo
と表示される。
ポイントは undef の使い方。
マクロは常に関数のスコープをオーバーライドしてくれて、undef することでマクロのスコープが取り消され、再び関数のスコープが見える。関数に対して undef しても全く意味がない(悪さもしないけど)。
僕はよくこのテクニックを駆使して malloc/calloc/realloc/free をマクロでオーバーライドして、メモリリークを見つけるのに使用する。