これを試して:
#ifdef SOMETHING
#define foo(x)
#else
#define foo(x) MyFunction(x)
#endif
関数に複数の引数がある場合:
#ifdef SOMETHING
#define foo(x,y,z)
#else
#define foo(x,y,z) MyFunction(x,y,z)
#endif
関数に可変数の引数がある場合、コンパイラは、次のようないわゆる「可変個引数マクロ」をサポートしている可能性があります。
#ifdef SOMETHING
#define foo(...)
#else
#define foo(...) MyFunction(__VA_ARGS__)
#endif
この種のものが実際に使用されているのを見た理由は、リリース ビルドからログ機能を取り除くためです。ただし、「デバッグ」ビルドと「リリース」ビルドを分離するも参照してください。異なるビルドを使用する必要があるかどうかを疑問視する人もいます。
または、関数呼び出しを何も再定義する代わりに、この回答に対するジョナサンのコメントは、次のようなことを提案しました。
#ifdef SOMETHING
#define foo(...) do { if (false) MyFunction(__VA_ARGS__) } while (0)
#else
#define foo(...) do { if (true) MyFunction(__VA_ARGS__) } while (0)
#endif
これを行う理由は、関数呼び出しが常にコンパイルされるため (削除された変数への参照などの不当なエラーが残らないようにするため)、必要な場合にのみ呼び出されるようにするためです: Kernighan & Pike The Practice of ProgrammingおよびGoddardを参照してください宇宙飛行センターのプログラミング標準。
debug.h ファイルから (1990 年に作成されたため、 を使用していません__VA_ARGS__
):
/*
** Usage: TRACE((level, fmt, ...))
** "level" is the debugging level which must be operational for the output
** to appear. "fmt" is a printf format string. "..." is whatever extra
** arguments fmt requires (possibly nothing).
** The non-debug macro means that the code is validated but never called.
** -- See chapter 8 of 'The Practice of Programming', by Kernighan and Pike.
*/
#ifdef DEBUG
#define TRACE(x) db_print x
#else
#define TRACE(x) do { if (0) db_print x; } while (0)
#endif /* DEBUG */
C99 では、二重括弧のトリックは不要になりました。C89 との互換性が問題にならない限り、新しいコードでは使用しないでください。