任何人都可以参考
va_list
在x86_64 ABI(Linux上使用的那个)中? 我正在尝试调试一些堆栈或参数似乎已损坏的代码,这确实有助于理解我应该所见...
最新回答
- 2021-1-121 #
- 2021-1-122 #
在i386体系结构中,va_list是指针类型.但是,在AMD64体系结构中,它是一种数组类型.有什么不同? 实际上,如果将&操作应用于指针类型,则将获得此指针变量的地址.但是,无论您对数组类型应用和操作多少次,其值都是相同的,并且等于该数组的地址。
那么,您应该在AMD64中做什么? 在函数中传递va_list变量的最简单方法是不带*或&运算符来传递它。
例如:
void foo(const char *fmt, ...) { va_list ap; int cnt; va_start(ap, fmt); bar(fmt, ap); va_end(ap); return cnt; } void bar(const char *fmt, va_list ap) { va_arg(ap, int); //do something test(ap); } void test(va_list ap) { va_arg(ap, int); //do something }
就可以了! 而且您不必担心有多少论点。
相关问题
- 如何获取Linux(ubuntu)上的视频捕获设备(网络摄像机)列表? (C / C ++)c++clinuxwebcamdevice2021-01-12 01:27
- c:即使使用mathh和库链接-lm也"未定义对'pow'的引用"clinuxmathgcc2021-01-10 19:25
- c:分离的与可连接的POSIX线程clinuxpthreadsdetach2021-01-09 20:58
- c++:从编译的可执行文件中获取编译器选项?c++clinux2021-01-09 08:54
我将自己的评论写成了答案。
这可能会有所帮助.这是参考,尽管是轻量级的( EDIT :原始链接已失效; 替换了wayback Machine保留的链接)。
可变参数列表参考从第50页开始,然后继续,第52-53页,文档
pva_list
:原来的问题是gcc在制造
va_list
数组类型.我的功能是签名:,我想传递一个指向
ap
的指针 到另一个功能,所以我做了:不幸的是,数组类型会衰减为函数参数列表中的指针类型,因此,我没有将指针传递给原始结构,而是将指针传递给了指针。
要解决此问题,我将代码更改为:
这是我能想到的唯一便携式解决方案,它解决了
va_list
是数组类型,可能不是。