【整理】关于 va_copy 的兼容性问题

首先查看 Linux 下的 man 信息。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

[root@Betty ~]# man va_copy

STDARG(3)                  Linux Programmer’s Manual                 STDARG(3)

 

NAME

       stdarg - variable argument lists

 

SYNOPSIS

       #include <stdarg.h>

 

       void va_start(va_list ap, last);

       type va_arg(va_list ap, type);

       void va_end(va_list ap);

       void va_copy(va_list dest, va_list src);

   

  ...

  ...

   

   va_copy

       An  obvious implementation would have a va_list be a pointer to the stack frame of the variadic function

       In such a setup (by far the most common) there seems nothing against an assignment

       一种最常见的实现是将 va_list 作为指向变参函数栈帧的指针使用。在这种情况下(最常见情况),va_copy 的功能和下面的赋值操作可以等价

                   va_list aq = ap;

       Unfortunately, there are also systems that make it an array of pointers (of length 1), and there one needs

       不幸的是,有一些系统将 va_list 实现成了指针数组(长度为 1),故操作必须如下才能保证正确

                   va_list aq;

                   *aq = *ap;

       Finally, on systems where parameters are passed in registers, it may be necessary for va_start() to allocate

       memory, store the parameters there, and also an indication of which parameter is next, so that va_arg() can

       step through the list. Now va_end() can free the allocated memory again. To accommodate this situation, C99

       adds a macro va_copy(), so that the above assignment can be replaced by

       在使用寄存器(register)传参的系统上,va_start() 函数会负责所需内存的分配以及相应参数值的存储,并且会指示下一个待处理的参数是

       谁,以便于 va_arg() 能够遍历变参列表。va_end() 会负责分配内存的释放工作。为了满足上述行为,C99 添加了宏定义 va_copy(),所以

       上面的赋值操作可以被下面的代码替代

                   va_list aq;

                   va_copy(aq, ap);

                   ...

                   va_end(aq);

       Each invocation of va_copy() must be matched by a corresponding invocation of va_end() in the same function

       Some systems that do not supply va_copy() have __va_copy instead, since that was the name used in the draft proposal.

       每一次对 va_copy() 的调用都必须与 va_end() 进行配对(同一个函数内部)。一些系统上不支持 va_copy() 但是提供了 __va_copy() 也

       是可以的,该名字的由来是因为在草案中就是这个。

 

CONFORMING TO

       The va_start(), va_arg(), and va_end() macros conform to C89.  C99 defines the va_copy() macro.

       va_copy() 是在 C99 中被支持的。

       有了上述信息,就可以大体确认了 VS2010 是不支持 va_copy() 的,同时发现其对 __va_copy() 也不支持。所以,只能自己实现一个替代方案了。

在 MySQL 5.6.10 中有如下的兼容性代码: 

?


1

2

3

4

#ifndef va_copy

#define va_copy(dst, src)   memcpy(&(dst), &(src), sizeof(va_list))

#endif

va_copy(aq, ap);

在 Jansson-2.5 库中的 jansson_private.h 中有如下定义

?


1

2

3

4

5

6

7

8

9

/* va_copy is a C99 feature. In C89 implementations, it's sometimes

   available as __va_copy. If not, memcpy() should do the trick. */

#ifndef va_copy

#ifdef __va_copy

#define va_copy __va_copy

#else

#define va_copy(a, b)  memcpy(&(a), &(b), sizeof(va_list))

#endif

#endif

时间: 2025-01-02 02:00:50

【整理】关于 va_copy 的兼容性问题的相关文章

【DB 2学习】查看一个数据库的配置文件

db2 => get db cfg for sample        数据库 sample 的数据库配置  数据库配置发行版级别                                    = 0x0c00  数据库发行版级别                                        = 0x0c00  数据库地域                                              = CN  数据库代码页                  

DOM文档和Javascript的IE和Firefox兼容性

长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javascript兼容性: 一.函数和方法差异 : 二.样式访问和设置 : 三.DOM方法及对象引用 : 四.事件处理 : 五.其他差异的兼容处理 .   一.函数和方法差异 1 . getYear()方法 [分析说明]先看一下以下代码: var year= new Date().getYear(); do

CSS兼容性技巧大全(一)

网页制作Webjx文章简介:CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理技巧并整理了一下.对于web2.0的过度,请尽量用xhtml格式写代码,而且DOCTYPE 影响 CSS 处理,作为W3C的标准,一定要加 DOCTYPE声明. CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理技巧并整理了一下.对于web2.0

最近整理的一份CSS文字隐藏的demo

{ hide_text } CSS文字隐藏总结报告 最近整理的一份CSS文字隐藏的demo,总结了几种方法,希望得出一种最完美的方案放进自己的代码片段,可是,到最后却陷入一种重复不断地推翻结论的境地.因为需要考虑的应用场景和元素实在太多,放下浏览器不谈,不同的应用终端,不同的标签结构会有不一样的最优方案,因此,与其希望在工作上多"偷一些懒",不如平常多巩固积累基础的知识,在需要权衡的时候,便能更加得心应手. 因为自己经验尚浅,demo部分难免会有错漏情况,如发现问题,望大家能指出. 方

CSS对浏览器的兼容性性处理(IE7,6与Fireofx)

IE7,6与Fireofx的兼容性的处理实在是让前端WEB开发者为之而头疼的事情,建议尽量用符合W3C标准格式写代码,本文搜集整理了一些于此相关方面的知识,有此需求的各位朋友可以参考下,希望对大家有所帮助   从网上收集了IE7,6与Fireofx的兼容性处理方法并整理了一下.对于浏览器的兼容性问题,请尽量用符合W3C标准格式写代码.而且DOCTYPE 影响 CSS 处理,作为W3C的标准,一定要加 DOCTYPE声名,并且需要写到页面的最上面. input.br.img等为常用自闭合标签,需要

怎么禁用Win8程序兼容性助理?

win8系统下我们操作很多程序的时候发现"程序兼容性助理"非常让人烦心,经常弹窗提醒用户,当前程序可能存在兼容问题.实际上这些程序在系统兼容性上并没有什么问题,不会对系统照成什么影响,那么我们可以通过高置来关闭他. 今天小编教大家使用策略组来关闭"兼容性助手" 1.使用快捷键"Win+R"打开运行输入框,然后键入gpedit.msc并回车,立即打开本地组策略编辑器; 2.依次展开用户配置 ---管理模板---Windows组件; 3.在策略组右侧

IE7,6与Fireofx的CSS兼容性处理方法集结

CSS对浏览器的兼容性有时让人很头疼,尤其是对于IE6这个问题多多的浏览器版本,从网上收集了IE7,6与Fireofx的兼容性处理方法并整理了一下.对于web2.0的过度,请尽量用xhtml格式写代码,而且DOCTYPE 影响 CSS 处理,作为W3C的标准,一定要加DOCTYPE声明.  一.CSS 1.vertical-align:middle文字垂直居中,对于某些元素如div{width:200px;height:200px;}不会有效果,只需给div{line-height:200px;

js滚轮事件兼容性问题需要注意哪些_javascript技巧

本文实例为大家解析了js滚轮事件需要注意的兼容性问题,供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> #div { width: 300px; height: 300px; background: red; } </s

IE和Firefox的Javascript兼容性总结[推荐收藏]_javascript技巧

长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javascript兼容性: 一.函数和方法差异: 二.样式访问和设置: 三.DOM方法及对象引用: 四.事件处理: 五.其他差异的兼容处理. 一.函数和方法差异 1. getYear()方法 [分析说明]先看一下以下代码: 复制代码 代码如下: var year= new Date().getYear();