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