va-args无法正确解析

时间:2010-08-06 23:57:00

标签: c variadic-functions

我有以下功能:

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。有什么特别的东西我错过了吗?

1 个答案:

答案 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还是反过来。

最后,我假设fp32float的别名;海湾合作委员会有话要对我说:

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

你应该留意那个警告。如果我不这样做,程序就会崩溃。