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:有没有办法让我的模板类型的所有实例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 的回答。

4

1 回答 1

1

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

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