もちろん、グローバルスコープに加えて。
参照をキャッシュするマクロを持つカスタムアサーションクラスがあります__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に対する回答はまだ必要です。