Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 变量函数在Win32中工作,但在Win32中不工作_C_64 Bit_Variadic Functions - Fatal编程技术网

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哦,是的。开头的短语非常混乱。谢谢。