社区首页 >问答首页 >C语言变分函数混淆

C语言变分函数混淆
EN

Stack Overflow用户
提问于 2013-03-29 23:01:29
回答 2查看 441关注 0票数 1

我正在尝试弄清楚va_start()和va_arg()宏背后是什么。下面的代码运行良好。

代码语言:javascript
代码运行次数:0
复制
#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;
}

尽管如此,我还是写道:

代码语言:javascript
代码运行次数:0
复制
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.0409377 4.88084e-270 4.85706e-270 1 2 3 4 5 6 7 8 9。我认为可变参数放在最后声明的参数的旁边,但显然有更复杂的情况。如果有人揭发我哪里错了或者到底发生了什么,我会非常高兴的。

EN

回答 2

Stack Overflow用户

发布于 2013-03-29 23:09:16

va_startva_arg和别忘了va_end是特定于编译器的。你不能仅仅把它们从别的地方拿来,然后期望它们能工作。如果你是一名编译器工程师,最好按照手册中的说明来使用它们,并且只试着理解它们的内部工作原理。

您可以在编译器的源代码中找到它;)

票数 1
EN

Stack Overflow用户

发布于 2013-03-29 23:50:18

您的手写宏将在一台机器上工作,该机器总是传递堆栈上的所有参数,并将较小的类型填充到sizeof(int)。然而,许多机器(现在大多数?)不要在堆栈上传递参数--而是在寄存器中传递参数,并且只有在寄存器中无法容纳太多参数时才使用堆栈。

因此,为了处理va_args,编译器需要知道ABI,以及在什么情况下将把哪些参数放在哪里。通常要做的是让va_list包含多个数组(足以容纳所有可能包含args的寄存器)和多个指针(通常,每种类型的寄存器一个指针,堆栈一个指针。va_start将所有参数寄存器转储到数组中并初始化指针,然后va_arg计算出给定参数类型将被传递到哪种类型的寄存器中,并将值从适当的点中取出。因此,对于一个假设的处理器,其中8个regs用于整数/指针参数,8个regs用于浮点/双精度参数,您可能具有如下内容:

代码语言:javascript
代码运行次数:0
复制
typedef struct {
    intptr_t iregs[8], *iptr;
    double   fregs[8], *fptr;
    char     *spptr;
} va_list;

inline void _builtin_va_start(va_list &ap, arg) {
    // dump the registers might be used to pass args into ap->iregs and ap-fregs,
    // setup iptr and fptr to point into iregs and fregs after the arguments that
    // correspond to 'arg' and those before it.  spptr points into the stack space
    // used for arguments after regs run out
}
inline _builtin_va_arg(va_list &ap, type) {
    if (type is integer or pointer) {
        if (ap->iptr == ap->iregs+8) {
            rv = *(type *)ap->spptr;
            ap->spptr += sizeof(type);
        } else {
            rv = *ap->iptr++;
        }
    } else if (type is float or double) {
        if (ap->fptr == ap->fregs+8) {
            rv = *(type *)ap->spptr;
            ap->spptr += sizeof(type);
        } else {
            rv = *ap->fptr++;
        }
    } else {
        // some other type (struct?) deal with it
    }
}

请注意,这两个_builtin_va函数都不能用C编写;它们需要内置到编译器中

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15712760

复制
相关文章
Asp.Net Mvc表单提交(批量提交)
Asp.Net Mvc中Action的参数可以自动接收和反序列化form表单的值,
yaphetsfang
2020/07/30
3K0
在ASP.NET MVC 4中使用Kendo UI Grid
Kendo UI 是Telerik推出的一套based on jQuery 的 Framework,提供了很多控件(Menu 、Grid 、Combox等...), 底层以Html5 + jQuery 来打造,并且兼容于各大浏览器,包含IE7、IE8。相关介绍可以参考AJAX式数据清单的新选择-Kendo UI Grid。 以下内容参考台湾的黑老大的文章:在ASP.NET MVC 4中使用Kendo UI Grid 建立一个ASP.NET MVC 4专案 使用NuGet安装KendoUIWeb及Kendo
张善友
2018/01/22
3.3K0
在ASP.NET MVC 4中使用Kendo UI Grid
ipa上传,提交AppStore,windows上传ipa
将ipa提交到AppStore需要Mac电脑操作,现在大部分的程序员都是使用混合开发平台windows系统的电脑,自己装虚拟机过程又繁琐。使用此工具只需要网页上点两下帮你完成这些鸡毛蒜皮事,让你有更多的时间花在改bug上
英曼畅学
2023/04/17
1.2K0
Spring MVC 提交带有点分隔的参数
重点就是需要配置参数@InitBinder告诉当请求的方法上有orderTargetingsVo这个名称的参数的时候,参数普遍有一个前缀。意思就是给这个vo里面去set值的时候使用没有这个前缀的名称与vo里面的set方法去匹配;
前Thoughtworks-杨焱
2021/12/08
5120
Spring mvc文件上传实现
三个要素: 1.表单项type=“file” 2.表单的提交方式:post 3.表单的enctype属性是多部分表单形式:enctype=“multipart/form-data” 会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。 3.1.当form表单修改为多部分表单时,request.getParameter()将失效。 3.2.enctype=“application/x-www-form-urlencoded”时,form表单的正文内容格式是:key=value&key=value&key=value 3.3.当form表单的enctype取值为Mutilpart/form-data时,请求正文内容就变成多部分形式:
一只胡说八道的猴子
2020/10/28
3970
Spring mvc文件上传实现
Spring Web MVC 文件上传
1.1 相关依赖 <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2
Demo_Null
2020/09/28
1K0
Spring Web MVC 文件上传
Spring MVC表单防重复提交
利用Spring MVC的过滤器及token传递验证来实现表单防重复提交。 创建注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Token { boolean create() default false; boolean remove() default false; } 在跳转页面的方法上加上:@Token(create = true
Java技术栈
2018/03/30
1.7K0
Spring MVC表单防重复提交
Spring MVC 处理文件上传
由此说明 MultipartFile 的实际类型为 org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile
acc8226
2022/05/17
4930
Spring mvc文件上传实现
**3.**表单的enctype属性是多部分表单形式:enctype=“multipart/form-data”
一只胡说八道的猴子
2020/10/18
5140
Spring mvc文件上传实现
【Telerik和Kendo UI组件】上海道宁与progress为您提供Web、移动和桌面构建功能更丰富的现代体验
Progress是已经成立40多年的科技公司,是一家经验丰富、值得信赖的产品供应商。
51Component
2022/08/23
2.4K0
【Telerik和Kendo UI组件】上海道宁与progress为您提供Web、移动和桌面构建功能更丰富的现代体验
【jquery ajax】实现文件上传提交
✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 在这里看原生ajax实现文件上传 文章目录 JQuery实现文件上传提交   定义UI结构   验证是否选择了文件   向FormData中追加文件并发起ajax请求   jquery实现loading效果   完整代码 JQuery实现文件上传提交   定义UI结构 <script src="https://cdn.
坚毅的小解同志的前端社区
2022/11/28
4K0
【jquery ajax】实现文件上传提交
当大模型不是问题时,如何应对 LLM 的工程化落地挑战?
几个月前,在 Thoughtworks 的内部 AIGC 研讨会里,我们一直达成了一系列一致观点,诸如于:如果没有 “开源模型” 降低企业应用 LLM 的成本,那么 LLM 会很快消亡。所以,我们相信开源 LLM + LoRA 微调会成为企业的一种主流方式。现今,我们可以看到 LLaMA 2、Code LLaMA 2 等模型在不断刷新这种可能性。
Phodal
2023/09/10
2.1K1
当大模型不是问题时,如何应对 LLM 的工程化落地挑战?
Git提交时过滤某些文件
4.这个文件处理好以后,如果感觉没有作用,说明你在创建这个文件之前就已经add过了,这时执行
Arno
2019/12/06
2.9K0
Git提交时过滤某些文件
Ajax使用formData提交带图片上传的表单
记录一下今天踩过的坑。。这么个问题居然搞了快两个小时了。ssm框架,前台form带图片上传,因为效验表单数据,所以不能直接submit。
sunonzj
2022/06/21
2.3K0
使用Kindeditor的多文件(图片)上传时出现上传失败的解决办法/使用Flash上传多文件(图片)上传时上传失败的解决办法
近来用户反映希望我们把在线编辑器中的多图片上传功能实现,因为他们在编辑商品描述时经常会有一次上传多张图片的需求,如果要逐张选择的话效率很低,客户的需求就是我们的追求,很快我们就把完善功能排到了日程表中,要求尽快实现。
风柏杨4711
2021/03/15
3.5K0
.net mvc + layui做图片上传(一)
  图片上传和展示是互联网应用中比较常见的一个功能,最近做的一个门户网站项目就有多个需要上传图片的功能模块。关于这部分内容,本来功能不复杂,但后面做起来却还是出现了一些波折。因为缺乏经验,对几种图片上传的方法以及使用范围和优缺点都不太了解,导致在做相关功能时也确实走了一些弯路。
CherishTheYouth
2019/07/30
1.5K0
.net mvc + layui做图片上传(一)
Spring MVC多种情况下的文件上传
会洗碗的CV工程师
2023/10/14
2180
Spring MVC多种情况下的文件上传
java之spring mvc之文件上传
注意,下面说的配置文件,一般都是值的src下的配置文件,即mvc.xml。如果是web.xml,则直接说 web.xml
Vincent-yuan
2019/09/11
4550
java之spring mvc之文件上传
点击加载更多

相似问题

当所有的异步方法都完成时,C#添加异步方法的结果

12

当user.csv中的所有用户都完成时,停止users测试

26

当不同演示程序中的所有异步方法都完成时,更新UI状态

12

当向量中的所有值都小于10^-8时,要求代码停止

11

当RecylerView中的所有onCreateViewHolder都完成时通知

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文