va-args не разрешается правильно - PullRequest
1 голос
/ 07 августа 2010

У меня есть следующая функция:

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 g_YourName_Data и корректно инициализирует его с максимум 4 m_NumFloats.

Вызов va_arg разрешается до 0.0.s_Test_Data существует, и функция Register называется соответствующей.va-list просто не позволит мне разрешить первый аргумент в float, в который я его передал.Есть что-то конкретное, что мне не хватает?

1 Ответ

2 голосов
/ 07 августа 2010

Попробуйте:

#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;У GCC было это, чтобы сказать мне:

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

Вы должны учесть это предупреждение.Программа не работает для меня, если я не.

...