0

特定のプロプロセッサ#defineが存在する必要があるヘッダーファイルを含めていますが、これが残りのコードを汚染することは望ましくありません。

// FOO may or may not already be defined here
#define FOO
#include "Bar.h"
#undef FOO
// FOO should be defined or not, as per the starting state

私は次のように考えています:

#ifdef FOO
#define FOO_DEFINED
#endif

#define FOO
#include "Bar.h"

#ifndef FOO_DEFINED
#undef FOO
#else
#undef FOO_DEFINED
#endif

質問:

  1. 上記は機能しますか、つまり、すべてのマクロ定義 (または不足) を以前の状態に復元しますか?

  2. おそらくもっと簡単な解決策はありますか?

  3. FOO が既に定義されているかどうかは問題#defineですか? #ifndefこれを防ぐために別のものを追加する必要がありますか?

4

2 に答える 2

1
  1. はい、動作するはずです。
  2. #pragma push_macro/pop_macro("macro_name") を念頭に置いていますが、gcc と MS VC++ でのみ機能する可能性があります
  3. はい、重要です。別の値で再度定義すると、警告が表示されます。あなたが述べているように、#ifndef でシールドできます。
于 2013-03-05T20:24:29.660 に答える
1

あなたの例では、 Bar.h は FOO が定義されているかどうかのみを気にし、それにバインドされた実際の式は気にしないようです。さらに、他の誰か(あなたのコード例自体がヘッダーファイルにあると思います)が FOO を定義し、それにバインドされた式を気にしている場合、空の式で FOO を再定義するという間違いを犯したくありません。もしそうなら、あなたは単純化したいと思うかもしれません:

#ifndef FOO
#define FOO
#define UNDEF_FOO
#endif

#include "Bar.h"

#ifdef UNDEF_FOO
#undef FOO
#endif
于 2013-03-05T20:23:24.573 に答える