gpt4 book ai didi

c - gcc 中如何实现可变参数?

转载 作者:太空狗 更新时间:2023-10-29 16:25:14 26 4
gpt4 key购买 nike

int max(int n, ...)

我正在使用 cdecl 调用约定,其中调用者在被调用者返回后清理变量。

我想知道宏 va_endva_startva_arg 是如何工作的?

调用者是否将参数数组的地址作为第二个参数传递给 max?

最佳答案

如果您查看 C 语言在堆栈上存储参数的方式,宏的工作方式应该变得清晰:-

Higher memory address    Last parameter
Penultimate parameter
....
Second parameter
Lower memory address First parameter
StackPointer -> Return address

(注意,根据硬件的不同,堆栈指针可能向下一行,上下可能会互换)

参数总是像这样存储1,即使没有... 参数类型。

va_start 宏只是设置一个指向第一个函数参数的指针,例如:-

 void func (int a, ...)
{
// va_start
char *p = (char *) &a + sizeof a;
}

这使得 p 指向第二个参数。 va_arg 宏执行此操作:-

 void func (int a, ...)
{
// va_start
char *p = (char *) &a + sizeof a;

// va_arg
int i1 = *((int *)p);
p += sizeof (int);

// va_arg
int i2 = *((int *)p);
p += sizeof (int);

// va_arg
long i2 = *((long *)p);
p += sizeof (long);
}

va_end 宏只是将 p 值设置为 NULL

注意事项:

  1. 优化编译器和一些 RISC CPU 将参数存储在寄存器中而不是使用堆栈。 ... 参数的存在将关闭此功能并让编译器使用堆栈。

关于c - gcc 中如何实现可变参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12371450/

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