これを行う古典的な方法は次のようになります。
foo.h
#ifndef FOO_H_INCLUDED
#define FOO_H_INCLUDED
#if SOME_CHECK
extern void foo(int x, int y, int z);
#define FOO(x, y, z) foo(x, y, z)
#else
#define FOO(x, y, z) ((void)0)
#endif
#endif /* FOO_H_INCLUDED */
条件付き呼び出しのコードfoo()
#include "foo.h"
...
FOO(a, b, c);
...
SOME_CHECK がゼロ以外の値に定義されている場合、コードは指定さfoo()
れた引数で呼び出します。SOME_CHECK が定義されていない場合、コードは展開((void)0)
され、コンパイラによって無視されます。
必要に応じて、代わりの定義を空の文字列のままにしておくこともできます (を使用する代わりに((void)0)
、ただし、誰かがFOO()
コンマ演算子または三項演算子のコンテキストで使用しようとすると、問題が発生します。たとえば、次のようになります。
FOO(a, b, c), ALTEREGO(d, e f);
(x > y) ? FOO(a, b, c) : ALTEREGO(d, e, f);
これらの両方で、#define FOO(x, y, z) /* Nothing */
構文エラーが発生します。これは世界の終わりではありません。どちらも恐ろしいコードであり、推奨されるべきではありません。しかし、それはあなたのプロジェクトのためにあなたがしなければならない判断の呼びかけです.