C语言编程细节
2014-01-08 17:26
141 查看
1。C函数参数压栈顺序为从右到左,即第一个参数最靠近栈顶。
2。可变参数va-list必须有至少一个参数,最左边的参数,即栈顶参数,这样可以根据第一个参数地址,从低地址起,到高地址,逐一找到其他参数。
Linux 相关va_list宏定义
/*
* Storage alignment properties
*/
#define _AUPBND (sizeof (acpi_native_int) - 1)
#define _ADNBND (sizeof (acpi_native_int) - 1)
/*
* Variable argument list macro definitions
*/
#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))
//先得到ap的值,加了size bounder,然后减了size得到该T的值。
#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))
#define va_end(ap) (void) 0
#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))
2。可变参数va-list必须有至少一个参数,最左边的参数,即栈顶参数,这样可以根据第一个参数地址,从低地址起,到高地址,逐一找到其他参数。
Linux 相关va_list宏定义
/*
* Storage alignment properties
*/
#define _AUPBND (sizeof (acpi_native_int) - 1)
#define _ADNBND (sizeof (acpi_native_int) - 1)
/*
* Variable argument list macro definitions
*/
#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))
//先得到ap的值,加了size bounder,然后减了size得到该T的值。
#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))
#define va_end(ap) (void) 0
#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))
相关文章推荐
- C语言常见编程操作,却有很多需要留心细节(字符串连接操作)
- 编程实践中C语言的一些常见细节
- C语言编程细节之n=-n的问题
- C语言模块化编程中如何隐藏结构实现细节
- C语言编程细节总结
- C语言编程总结--程序员必须知道的77条编程细节
- 编程实践中C语言的一些常见细节
- C语言细节知识积累: strncpy
- C语言高效编程的几招
- 新书自学C语言编程的一些书籍
- C语言编程艺术--C语言中enum变量类型的使用
- 人生需要规划,学好C语言编程,把握自己的未来,are you ready?
- linux socket 编程(C语言)
- C语言学习历程——编程练习2——03
- c语言编程时常见错误(持续更新)
- c语言编程--字符串指针
- C语言编程中常见的漏洞原因
- Linux C语言 网络编程(二) 服务器模型
- 编程基础-----C语言如何获取当前目录和程序目录
- C语言学习历程——编程练习2——08