我有以下功能:VA-ARGS不解決正確
void Register(Data* _pData, uint32 _Line, const char* _pFile, ...)
{
va_list Args;
va_start(Args, _pFile);
for(uint i = 0;i m_NumFloats; ++i)
{
_pData->m_Floats[i] = va_arg(Args, fp32);
}
va_end(Args);
}
這是由宏調用:
#define REG(_Name, ...)\
{\
if(s_##_Name##_Data.m_Enabled)
Register(&s_##_Name##_Data, __LINE__, __FILE__, ##__VA_ARGS__);\
}\
用法用量:
REG(Test, (fp32)0.42f);
數據 - 結構看起來像:
struct Data
{
int m_NumFloats;
fp32 m_Floats[4];
}
Data的創建宏將創建靜態的Data g_YourName_Data
並使用最多4個m_NumFloats正確初始化它。
va_arg調用解析爲0.0。存在s_Test_Data並且註冊函數被稱爲適當的。 va-list只是簡單地不會讓我將第一個參數解析到我傳入的float中。有什麼具體的我失蹤?
什麼是_Name_Data?爲什麼當你的宏定義沒有在任何地方使用'_Name'時,你在宏中聲明'_Name'參數? '__VA_ARGS__'前的'##'是什麼? – AnT 2010-08-07 00:08:44
沒有'_Name_Data'。這是一個使用'_Name'來查找靜態聲明對象的宏,在這種情況下,這個對象會擴展爲'_Test_Data'。所以宏使用'_Name'。如果沒有實際的額外參數傳遞,'##'用於剝離','。 – Simon 2010-08-07 07:34:18
@AndreyT「__VA_ARGS__'前的##是什麼?」 - 它使可變宏接受零參數成爲可能。 – 2013-12-18 12:06:07