0

もちろん、グローバルスコープに加えて。


参照をキャッシュするマクロを持つカスタムアサーションクラスがあります__FILE__

#define DEFINE_THIS_FILE \
  static const char THIS_FILE__[] = __FILE__

ソースコードの場合、各ソースには独自のスコープがあるため、マクロの使用は大した問題ではありません。ただし、テンプレート化されたクラスはソースコードを使用できないため、TemplateClass.hで指定された宣言/定義ですべてのASSERT()呼び出しを実行する必要があります。

クラス定義の外でマクロを使用する場合、たとえばSingleton

DEFINE_THIS_FILE;

namespace NE
{
  template<typename T>
  class Singleton
  {
    ...
  }
}

次に、マクロは#includesを含むコードと同じスコープにSingletonなり、コンパイラーは。の再定義エラーをスローしますTHIS_FILE__。(もちろん、これは他のコードDEFINE_THIS_FILEマクロを使用している場合にのみ発生します。)

マクロを宣言に配置すると、コンパイラは文句を言いませんが、リンカはテンプレート化されたクラスの特定のインスタンスのTHIS_FILE__を見つけることができませんSingleton

namespace NE
{
  template<typename T>
  class Singleton
  {
    constexpr DEFINE_THIS_FILE;     // constexpr modifier required in this case
    ...
  }
}

私が得るリンカーエラーは、最初に定義さ れた場所と同じスコープに存在しないテンプレートインスタンス、Singleton.hが原因であると思います。
Undefined symbols for architecture x86_64:
"NE::Singleton<NE::NonTemplateType>::THIS_FILE__"

THIS_FILE__


OT:すべてのインスタンスがこの静的constマクロを使用できるように、テンプレートタイプのすべてのインスタンスにSingletonスコープを共有させる方法はありますか(グローバルは受け入れられません)?


Edit1
さらなるテストにより、次のことが確認されます。ASSERT ()を含むDEFINE_THIS_FILE 各テンプレートメソッド内
でマクロを使用すると、正しくコンパイルおよび実行されます 。この場合、インスタンスはスコープを共有していませんが、static const char THIS_FILE__メソッドごとに定義されています。これは機能しますが、std :: assert(の暗黙の割り当てを含む)と同じかそれ以上のROMを使用していると思われます__FILE__

OTへの答えが出るまで私はこれで解決します:)


Edit2
愚かな私。__FILE__上記の編集にリストされている回避策を使用する代わりに、const静的表現の代わりに直接使用する別のマクロUNCACHED_ASSERT(argsToCheck)を作成することもできます。
ただし、メソッドごとに複数のASSERTionを使用すると、キャッシュの恩恵を受けることができます。

ただし、OTに対する回答はまだ必要です。

4

1 に答える 1

1

名前のない名前空間に宣言を配置できます

#define DEFINE_THIS_FILE namespace { static const char THIS_FILE__[] = __FILE__; }
于 2013-01-16T03:33:57.147 に答える