2013-01-12 103 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__; } 
相關問題