0

プロジェクト内の多くのファイルにまたがって記述する必要がある次のコード行があります:-

#if SOME_CHECK
    foo(x, y, z);
#endif

このために、上記の 3 行のコードを次のような 1 つのマクロにラップする予定です。

#define foo(x, y, z) #if SOME_CHECK \
foo(x, y, z); \
#endif

しかし、これは明らかな理由でエラーになり、プリプロセッサ マクロを使用してこれらの 3 行のコードをラップするより良い方法を考えることができません。上記の問題を処理するためのより良い方法を提案できる人はいますか?

4

3 に答える 3

0

試してみてはどうですか:

#ifdef SOME_CHECK
#define foo(x,y,z) foo(x,y,z);
#else
#define foo(x,y,z)
#endif
于 2013-11-08T05:49:24.133 に答える
0

これを行う古典的な方法は次のようになります。

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 */構文エラーが発生します。これは世界の終わりではありません。どちらも恐ろしいコードであり、推奨されるべきではありません。しかし、それはあなたのプロジェクトのためにあなたがしなければならない判断の呼びかけです.

于 2013-11-08T06:12:20.013 に答える