を持つ関数マクロ#define FOO(arg) foo(arg)
がありint foo(const char* bar);
ます。NDEBUG が定義されている場合、FOO は として定義されますが#define FOO(arg) 0
、多くの場合 FOO の戻り値が使用されないため、多くのコンパイラ警告が発生します。このソリューションは ANSI C コンパイラで動作し、警告は発生しません。私はもう試した:
(void)0
: 変数に代入できません
static int foo(const char* bar) { return 0; }
: 一部のモジュールで未使用の静的関数の警告が発生します
static inline int foo(const char* bar) { return 0; }
: C99 コンパイラでのみ動作します
ご協力いただきありがとうございます!
edit1: トレース マクロのようなもので、プロジェクト全体で使用されます。ほとんどの場合、 のようなステートメントとして使用されますFOO("function x called");
が、いくつかのケースで を見ましたif (FOO("condition a")) { /* some more debug output */ }
。NDEBUG を定義し、最適化を有効にすると、FOO には何も残らないはずです。私はこれを思いつきませんでしたが、この混乱を片付けなければなりません:)。
edit2: gcc リリース ビルドでは、次のフラグが使用されることを追加する必要があります: -O3 -Wall -ansi
edit3: 今のところ、私は__inline int dummy() { return 0; }
. __inline は、VisualC と GCC の両方で ansi モードで動作します。