C 变量函数在Win32中工作,但在Win32中不工作
我已经使用以下功能很长时间了:C 变量函数在Win32中工作,但在Win32中不工作,c,64-bit,variadic-functions,C,64 Bit,Variadic Functions,我已经使用以下功能很长时间了: void AddRow(int iNumOfColumns,...) { int* pValuePerColumn = (int*)&iNumOfColumns+1; for (int i=0; i<iNumOfColumns; i++) { // Do something with pValuePerColumn[i] } } void AddRow(int列,…) { int*pValuePer
void AddRow(int iNumOfColumns,...)
{
int* pValuePerColumn = (int*)&iNumOfColumns+1;
for (int i=0; i<iNumOfColumns; i++)
{
// Do something with pValuePerColumn[i]
}
}
void AddRow(int列,…)
{
int*pValuePerColumn=(int*)&iNumOfColumns+1;
对于(int i=0;i取消限制指向数组最后一个元素或非数组对象的指针是未定义的行为:
int* pValuePerColumn = (int*)&iNumOfColumns+1;
...
pValuePerColumn[i]
将类型更改为size\t
与此问题无关
使用变量参数的唯一正确方法是stdarg.h中提供的宏。解除对指向数组最后一个元素或非数组对象的指针的防护是未定义的行为:
int* pValuePerColumn = (int*)&iNumOfColumns+1;
...
pValuePerColumn[i]
将类型更改为size\t
与此问题无关
使用变量参数的唯一正确方法是stdarg.h中提供的宏。您应该使用varargs
以可移植的方式访问额外的参数。查找va_列表
文档。您的代码可能应该下一步查看
void AddRow(int iNumOfColumns,...)
{
va_list ap;
va_start(ap, iNumOfColumns);
for (int i=0; i<iNumOfColumns; i++)
{
int col = va_arg(ap, int);
// Do something with col
}
va_end(ap);
}
void AddRow(int列,…)
{
va_列表ap;
va_开始(ap、INUMOF列);
对于(int i=0;i您应该使用varargs
以便携方式访问额外参数。查找va_列表
文档。您的代码可能应该下一步查看
void AddRow(int iNumOfColumns,...)
{
va_list ap;
va_start(ap, iNumOfColumns);
for (int i=0; i<iNumOfColumns; i++)
{
int col = va_arg(ap, int);
// Do something with col
}
va_end(ap);
}
void AddRow(int列,…)
{
va_列表ap;
va_开始(ap、INUMOF列);
对于(int i=0;i您熟悉stdarg.h?@2501:是的,我假设您是在暗示使用va_list
和va_args
?您应该使用va_args以实现可移植性。有关更多信息,请参阅。无论如何,使用stdarg.h会让编译器处理好这一点。您熟悉stdarg.h?@2501:是的,我假设您是在暗示使用对于va_list
和va_args
?您应该使用va_args以实现可移植性。有关更多信息,请参阅。无论如何,使用stdarg.h可以让编译器解决这个问题。谢谢。举个例子说明如何迭代参数可以使答案完美(尽管没有它我也可以)。顺便说一句,“撤销指向最后一个元素的指针…是UB”-这不正是stdarg.h
所做的吗?或者这是一个平台相关的问题,因为语言标准没有定义如何将函数参数推入堆栈(换句话说,是每个编译器提供的stdarg.h
的唯一版本)?@barakmanos每个体系结构的实现方式都不同。@barakmanos您应该阅读以下内容:谢谢,非常详细的描述!谢谢。一个如何迭代参数的示例将使答案变得完美(尽管没有它我很好)。顺便说一句,“撤销指向最后一个元素的指针…是UB”-这不正是stdarg.h
所做的吗?或者这是一个平台相关的问题,因为语言标准没有定义如何将函数参数推入堆栈(换句话说,是每个编译器提供的stdarg.h
的唯一版本)?@barakmanos每个体系结构的实现方式都不同。@barakmanos您应该阅读以下内容:谢谢,非常详细的描述!在我的问题中,您在哪里看到了varargs
?好的,谢谢您提供的编码示例。您可能应该删除开场白,因为我在任何地方都没有提到varargs
在我的问题中,有一个“可变函数”在标题中,不是吗?而且你的代码似乎试图访问iNumOfColumns
之后传递的参数。是的,好吧,我不会叫它varargs
…无论如何,我想这只是一个术语问题……再次感谢。@barakmanos哦,是的。开头的短语真的很混乱。谢谢。在我的问题中,你在哪里看到了任何用处关于varargs
?好的,谢谢您提供的编码示例。您可能应该删除开场白,因为我的问题中没有提到varargs
。@barakmanos有“可变函数”在标题中,不是吗?而且似乎您的代码正在尝试访问iNumOfColumns
之后传递的参数。是的,好吧,我不会将其称为varargs
…无论如何,我想这只是一个术语问题……再次感谢。@barakmanos哦,是的。开头的短语非常混乱。谢谢。