我有以下功能:
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);
Data-struct看起来像:
struct Data
{
int m_NumFloats;
fp32 m_Floats[4];
}
Data的创建宏创建静态Data g_YourName_Data
并使用最多4 m_NumFloats正确初始化它。
va_arg调用解析为0.0。存在s_Test_Data,并且调用Register函数是合适的。 va-list只是简单地不允许我将第一个参数解析为我传递给它的float。有什么特别的东西我错过了吗?
答案 0 :(得分:2)
尝试:
#define REG(_Name, ...)\
{\
if(s_##_Name_Data.m_Enabled)\
Register(&s_##_Name_Data, __LINE__, __FILE__, __VA_ARGS__);\
}
摆脱令牌粘贴操作符。你我们在你的宏中也错过了一个'\'(也许是一个复制粘贴错误?)。
另外,请使用va_arg()
,而不是va_args()
。我不确定你是_Name
是_Name_Data
还是反过来。
最后,我假设fp32
是float
的别名;海湾合作委员会有话要对我说:
C:\TEMP\test.c:22: warning: `fp32' is promoted to `double' when passed through `...'
C:\TEMP\test.c:22: warning: (so you should pass `double' not `fp32' to `va_arg')
C:\TEMP\test.c:22: note: if this code is reached, the program will abort
你应该留意那个警告。如果我不这样做,程序就会崩溃。