gpt4 book ai didi

c - va-args 没有正确解析

转载 作者:太空宇宙 更新时间:2023-11-04 03:07:19 25 4
gpt4 key购买 nike

我有以下功能:

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 。有什么我遗漏的具体内容吗?

最佳答案

尝试:

#define REG(_Name, ...)\
{\
if(s_##_Name_Data.m_Enabled)\
Register(&s_##_Name_Data, __LINE__, __FILE__, __VA_ARGS__);\
}

去掉 token 粘贴运算符。您的宏中也缺少“\”(可能是复制粘贴错误?)。

此外,使用 va_arg(),而不是 va_args()。我不确定您是想将 _Name 设为 _Name_Data 还是相反。

最后,我假设 fp32float 的别名; 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

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

关于c - va-args 没有正确解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3428575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com