0

I'm currently working on a header only library and I'd like to be able to use some macros without them being usable from client code. Example:

// library_header1.h

#define MACRO_NUMBER_1(__X__) doSomethingWith(__X__) // etc...

class LibraryClass1
{
    // We'll use the macro somewhere in here.
};

Now, if I include library_header1.h i'm able to use MACRO_NUMBER_1. Is there any way I can avoid that?

4

3 に答える 3

3

他の人はすでに言及#undefしましたが、未定義にする必要があるマクロが多数あり、それらを多くのヘッダーで使用する必要がある場合はどうなりますか? この状況は、指定されたヘッダーを含むマクロと bewteen をヘッダーで定義および未定義にすることで対処できます。例えば:

// temp-macros.h
#if defined(OUTER)
#  define MACRO x
#  include OUTER
#  undef MACRO
#  undef OUTER
#endif

OUTERアイデアは、マクロが必要なヘッダーからセットアップしtemp-macros.h、2 番目のインクルードでマクロをインクルードして使用することです。

// macro-use.h
#if !defined(OUTER)
#  define OUTER "macro-use.h"
#  include "temp-macros.h"
#elif !defined(INCLUDED_MACRO_USE)
#  define INCLUDED_MACRO_USE
void use(int MACRO) { /*...*/ }
#endif

もちろん、この例では単純なマクロを 1 つだけ使用していますが、さらに多くのマクロがあり、それらがより複雑な場合、このアプローチが役立つ可能性があります。

于 2013-08-17T23:22:31.893 に答える
1

ライブラリ ユーザーがマクロにアクセスでき#undefないようにするには、マクロがもう必要ないことがわかっている場合に配置できます。

インテリセンス/オートコンプリートがマクロを認識しないようにしたい場合は、マクロ定義をスキップしてトリックを試みることができます。通常、次のように実行できます。

  • 追加の「識別」マクロを渡すように、コンパイル プロジェクト (ビジュアル ソリューション、メイクファイルなど) を設定します。何かのようなもの-DIAMCOMPILING
  • マクロ定義を保護する#ifdef IAMCOMPILING ... #endif

ほとんどの場合、IDE はIAMCOMPILINGマクロの定義を認識せず、スキップします。

ただし、実際にヘッダー ファイルでマクロを使用すると IDE が混乱し、存在しないエラーがフラグされることに注意してください。

于 2013-08-17T22:47:32.753 に答える
1

マクロが IDE によって認識されるのを止めることはできませんが、マクロに通常とは異なるプレフィックスを使用すると、ユーザーが実行したいことと衝突する可能性が低くなり、不快感が軽減されます。これは理想的な解決策ではないかもしれませんが、マクロの前に CCC や XWX など、通常のプログラマーが使用する可能性が低いものを付けることで解決できる場合があります。

(または、マクロを使用しないことは常に機能する解決策です!)

于 2013-08-17T22:58:27.260 に答える