我有以下功能: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