je la fonction suivante:VA-args ne résout pas correctement
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);
}
qui est appelé par la macro:
#define REG(_Name, ...)\
{\
if(s_##_Name##_Data.m_Enabled)
Register(&s_##_Name##_Data, __LINE__, __FILE__, ##__VA_ARGS__);\
}\
Avec l'utilisation:
REG(Test, (fp32)0.42f);
Le Data- struct ressemble à:
struct Data
{
int m_NumFloats;
fp32 m_Floats[4];
}
La macro de création de données crée le Data g_YourName_Data
statique et l'initialise correctement avec un maximum de 4 m_NumFloats.
L'appel va_arg résout à 0.0. s_Test_Data existe et la fonction Register est appelée appropriée. va-list ne me laisse tout simplement pas résoudre le premier argument dans le flotteur dans lequel je l'ai passé. Y a-t-il quelque chose de spécifique qui me manque?
Qu'est-ce que '_Name_Data'? Pourquoi déclarez-vous le paramètre '_Name' dans votre macro, quand votre définition de macro n'utilise pas' _Name' nulle part? Que fait '##' en face de '__VA_ARGS__'? – AnT
Il n'y a pas de '_Name_Data'. C'est une macro utilisant '_Name' pour trouver un objet déclaré statiquement qui dans ce cas se développe en' _Test_Data'. Donc, la macro utilise '_Name'. Le '##' est utilisé pour enlever le ',' si aucun paramètre supplémentaire n'est passé. – Simon
@AndreyT "Que fait ## devant" __VA_ARGS__'? " - il permet à une macro variadique de recevoir zéro argument. –