2013-01-12 70 views
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 
    { 
    ... 
    } 
} 

然后宏卷取中的那个来#include 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
进一步测试证实:使用宏DEFINE_THIS_FILE每个模板方法包含ASSERT()内将编译并正确运行....
在这种情况下,该实例AREN”共享范围,但为每种方法定义了static const char THIS_FILE__。这有效,但我怀疑它使用的是比std :: assert多的或更多的ROM(其隐含分配为__FILE__)。

我会满足于这一点,直到回答OT自带约:)


EDIT2
愚蠢的我。除了使用上面编辑中列出的解决方法之外,我还可以创建另一个宏,UNCACHED_ASSERT(argsToCheck),它直接使用__FILE__而不是常量静态表示。
尽管如此,每个方法的多个ASSERTions仍然可以从缓存中受益。

尽管如此,仍然需要OT的答案。

+0

OT:我真正好奇。有没有什么理由让你不仅仅使用'__FILE__'来为你使用'THIS_FILE__'的恶意目的?毕竟,它是由标准定义的,用来命名你使用的任何源文件。 – WhozCraig

+0

正如你自己所说,当以这种方式使用时,它将反映包含的cpp文件的名称。它会像你期望的那样为标题工作吗? –

+0

@WhozCraig:[Dr. Dobbs的博客](http://www.drdobbs.com/an-exception-or-a-bug/184401686)建议这样做是为了保存ROM并且不扩散__FILE__字符串的副本。 – cjcurrie

回答

1

你可以把你的宣言中具名命名空间

#define DEFINE_THIS_FILE namespace { static const char THIS_FILE__[] = __FILE__; } 
相关问题