除了全球範圍,當然。模板類的實例之間是否共享一個範圍?
我有一個自定義斷言類與宏緩存參考__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的答案。
OT:我真正好奇。有沒有什麼理由讓你不僅僅使用'__FILE__'來爲你使用'THIS_FILE__'的惡意目的?畢竟,它是由標準定義的,用來命名你使用的任何源文件。 – WhozCraig
正如你自己所說,當以這種方式使用時,它將反映包含的cpp文件的名稱。它會像你期望的那樣爲標題工作嗎? –
@WhozCraig:[Dr. Dobbs的博客](http://www.drdobbs.com/an-exception-or-a-bug/184401686)建議這樣做是爲了保存ROM並且不擴散__FILE__字符串的副本。 – cjcurrie