マクロで関数をオーバーライド。 #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 をマクロでオーバーライドして、メモリリークを見つけるのに使用する。