gpt4 book ai didi

c可变函数混淆

转载 作者:太空宇宙 更新时间:2023-11-04 02:57:34 24 4
gpt4 key购买 nike

我正在尝试找出 va_start()、va_arg() 宏指令背后的内容。下面的代码运行良好。

#include <iostream>
#include <cstdarg>

void f(double a, double b, ...)
{
va_list arg;
va_start(arg, b);
double d;
while((d = va_arg(arg, double)) != 0)
{
std::cout << d << '\n';
}
}

int main(int argc, char *argv[])
{
f(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 0.0);
return 0;
}

正如我所料,它给出了这样的输出:3 4 5 6 7 8 9。然后我找到了那个宏的定义(在互联网上,因为我的头文件 stdarg.h 很神秘——它定义了宏 va_arg(v, l) 就像 _builtin_va_arg(v, l),最后一个没有在它和 stdarg.h 中定义不包含任何内容,所以它在某些图书馆中吗???)。然而,代替“cstdarg”我写道:

typedef char* va_list;

#define _INTSIZEOF(n) \
((sizeof(n)+sizeof(int)-1) &~(sizeof(int)-1))

#define va_start(ap,v) \
(ap = (va_list)&v + _INTSIZEOF(v))

#define va_arg(ap,t) \
(*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))

#define va_end(ap) (ap = (va_list)0)

输出变得奇怪,比如 1-0.0409377-0.04093774.88084e-2704.85706e-2701个2个3个4个5个6个78个9.我认为可变参数紧挨着最后声明的参数放置,但显然情况更复杂。如果有人揭露我哪里错了或者那里到底发生了什么,我会非常高兴。

最佳答案

va_startva_arg 和不要忘记 va_end 是特定于编译器的。您不能只是从其他地方获取它们并期望它们起作用。如果您是编译器工程师,最好按照手册页使用它们,并且只尝试了解它们的内部工作原理。

P.S:哦,他们的定义通常非常神秘,使用微妙的技巧来使其工作。

P.S2:在回答您定义 _builtin_va_arg 的问题时:编译器知道它,称为 builtin。您会在编译器的源代码中找到它;)

关于c可变函数混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15712760/

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