模板类的实例之间是否存在共享的作用域

Is there a scope shared between instances of a template class?

本文关键字:存在 共享 作用域 是否 实例 之间      更新时间:2023-10-16

当然除了全局作用域。


我有一个自定义断言类,其中包含一个宏来缓存对__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
  {
    ...
  }
}

然后宏在与#包含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
    ...
  }
}

我假设我得到了链接错误,
Undefined symbols for architecture x86_64:
"NE::Singleton<NE::NonTemplateType>::THIS_FILE__"

是由于模板实例不存在于第一次定义THIS_FILE__的作用域中,Singleton.h


OT:是否有一种方法可以让我的模板类型Singleton的所有实例共享一个作用域(全局是不可接受的),以便所有实例都可以使用这个静态常量宏?


Edit1
进一步的测试证实:在包含ASSERT()的每个模板化方法中使用宏DEFINE_THIS_FILE 将编译并正确运行....
在这种情况下,实例不共享作用域,而是为每个方法定义了一个static const char THIS_FILE__。这是有效的,但我怀疑它使用的ROM与std::assert(其隐含的__FILE__分配)一样多或更多。

我将解决这个问题,直到OT的答案出现:)


Edit2
愚蠢的我。与其使用上面编辑中列出的解决方案,不如创建另一个宏UNCACHED_ASSERT(argsToCheck),直接使用__FILE__而不是const静态表示。
但是,每个方法有多个断言仍然可以从缓存中受益。

仍然需要OT的答案

您可以将声明放置在未命名的命名空间

#define DEFINE_THIS_FILE namespace { static const char THIS_FILE__[] = __FILE__; }