0

クラス宣言は通常次のようになります。

#ifndef MY_CLASS_20141116
#define MY_CLASS_20141116

...

class MyClass
{
    ...
}

#endif

私の質問は、新しい識別子を再定義する代わりにクラス名を使用しない理由です。

#ifndef MyClass

...

class MyClass
{
}

#endif

識別子の競合 (同じ識別子が 2 回表示される可能性がある) または名前空間の使用 (std::array のような完全な識別子が #ifndef ディレクティブで使用される可能性があるかどうかはわかりません) に関連するものがあると思います。

もっと丁寧な説明があれば最高です。

また、名前空間を使用する場合、2 番目のテストを使用することは可能ですか?

#ifndef A::MyClass //not compile, any equivalent?

namespace A
{
...

    class MyClass
    {
    }
}
#endif
4

1 に答える 1

2

最初の例:

#ifndef MyClass

...

class MyClass
{
}

#endif

「MyClass」はプリプロセッサに対して定義されていないため、これは機能しません。a で始まるディレクティブはすべて#プリプロセッサ ディレクティブであり、プリプロセッサが理解できる唯一のものです。class MyClassプリプロセッサにとって特別な意味はなく、プリプロセッサ定義を作成しません

それが機能するには、次を定義する必要がありMyClassます#define MyClass。ただし、これを行うと、プリプロセッサは に置き換えclass MyClassられclassコンパイルされません

次に、2 番目の例:

#ifndef A::MyClass //not compile, any equivalent?

A::MyClassはプリプロセッサ トークンではなく、複数のトークンです。#define SOMETHING1 つのトークン (文字で構成されるa-zA-Z_0-9) でのみ機能します。

于 2014-11-16T13:11:02.807 に答える