是否可以選擇性地編譯代碼的某些部分中的模板,還是僅限於預處理器?例如,如果我想刪除的代碼段與預處理程序,我知道我可以做:有選擇地編譯宏代碼之外的代碼
#if 0
static const char[] hello_world = "hello, world";
#endif
反正有做模板一樣嗎?
以防萬一我問錯了問題,這是我正在嘗試做的。我想在啓動應用程序時加載一些代碼。通常,我只是使用一個構造函數來完成我想要的任何操作並創建一個靜態變量。但是我希望這隻發生在調試版本中,並且代碼不會在發佈版本中運行。我用這個宏創建的代碼是用宏創建的,所以我似乎無法在宏中放置「#if 0」並使其正確擴展。
有沒有辦法在C++中做到這一點?
編輯:這裏是我目前使用的宏代碼的一個例子。
#define unittest(NAME) \
struct unittest_ ## NAME : \
public unittest::unittest_template<unittest_ ## NAME> \
{ \
unittest_ ## NAME() : \
unittest::unittest_template<unittest_ ## NAME>(#NAME) {} \
void run_test(); \
}; \
static unittest_ ## NAME NAME ## _unittest; \
void unittest_ ## NAME::run_test()
該代碼是用來做:
unittest(addTest)
{
assert_(5, 5); // there's an assert statement in the code
}
我喜歡它的外觀語法,但我不明白的方式來擺脫使用宏功能的機構。我嘗試使用一個開始/結束宏,並得到:
#ifdef UNITTEST
# define unittest_begin(NAME) // previous code
# define unittest_end() // nothing needed
#else
# define unittest_begin(NAME) #if 0
# define unittest_end() #endif
#endif
這似乎並不奏效。
EDIT2:原來的問題與它變成的東西完全不同。改變名字,希望它與實際問題更相關。
[有條件的編譯時包含/排除基於模板參數的代碼的可能的重複?](http://stackoverflow.com/questions/5659064/conditional-compile-time-inclusion-exclusion-of-基於代碼的模板參數) – Xeo 2011-06-05 00:41:25
這是重複的,但可悲的是似乎沒有解決方案。 :( – Xeo 2011-06-05 00:42:57
現在還不清楚你想要啓用或禁用什麼,你展示了一個全局變量的例子,但是你的描述涉及到啓用或禁用代碼,並且涉及到宏,你可以提供一個「不能放」 #if 0'你有問題嗎? – 2011-06-05 01:04:58