当然,除了全球范围。
我有一个带有宏的自定义断言类来缓存对以下内容的引用__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:有没有办法让我的模板类型的所有实例Singleton
共享一个范围(全局是不可接受的),以便所有实例都可以使用这个静态 const 宏?
Edit1
进一步的测试证实:在每个包含 ASSERT() 的DEFINE_THIS_FILE
模板化方法
中使用宏将正确编译和运行....
在这种情况下,实例不共享范围,但static const char THIS_FILE__
为每个方法定义了一个范围。这可行,但我怀疑它使用的 ROM 与 std::assert 一样多或更多(其隐含分配__FILE__
)。
我会解决这个问题,直到对 OT 的回答出现:)
Edit2
愚蠢的我。除了使用上面编辑中列出的解决方法,我还不如创建另一个宏 UNCACHED_ASSERT(argsToCheck) 直接使用__FILE__
而不是 const 静态表示。
但是,每个方法的多个 ASSERTions 仍然可以从缓存中受益。
不过,仍然需要对 OT 的回答。