嵌入式之经典知识点(三)

函数参数入栈顺序?

  1. 1.C语言函数参数入栈是从右向左展开的,这是由编译器决定的。更具体的说是函数调用约定决定了参数的入栈顺序。C语言采用的函数调用约定是_cdecl的,所以对于函数的声明,完整的是 int _cdecl fun(int a, int b);

可变参数列表  

可变参数列表是通过宏来实现的。这些宏定义在stdarg.h头文件中,是标准库的一部分。这个头文件声明了一个类型

va_list 和三个宏 va_start,va_arg,va_end.

int print(char *format, …)

宏va_start的第一个参数是va_list类型的变量,第二个参数是省略号前最后一个有名字的参数,功能是初始化va_list类型的变量,将其值设置为可变参数的第一个变量。

宏va_arg的第一个参数是va_list类型的变量,第二个参数是参数列表的下一个参数的类型。va_arg返回va_list变量的值,并使该变量指向下一个可变参数。

宏va_end是在va_arg访问完最后一个可变参数之后调用的。

typedef char *va_list;
/*把变量类型转换为va_list*/
#define va_start(ap, A)  (void)((ap) = (char *)&(A) + _Bnd(A, _AUPBND))
/*逗号表达式,执行逗号两边的表达式,然后返回右边表达式的值*/
/*va_arg(ap,T)的作用,将栈指针移位只下个数据位,并将当前的指针指向的值返回*/
#define va_arg(ap, T)  (*(T )((ap) += _Bnd(T, _AUPBND)) - _Bnd(T, _ADNBND)))
/*va_end(ap)将指针置为空指针*/
#define va_end(ap) (void)0

int print(const char* format,...)
{

}

  

#include <timer.h> 和 #include "timer.h"区别

< >是从Standard library的路径寻找timer.h,而“ ”是从当前路径寻找的。

const的具体意义

/*第一个和第二个作用是一样的,定义一个常数,不可被修改*/
constt int a;

int const a;


/*a是一个指向常整型数的指针,数不可改变,但是指针可以改变
 *这里const修饰的是int 而int定义的是一个数值,所以数不可改变,指针可以改变
 */
const int *a; //等同int const *a;

/*定义一个整型的常指针,指针不可修改,数可以修改
 *这里const修饰的是a,而a是一个int*,所以值可以改,但是指针步可改变
 */
int* const a;
 
/* 定义一个指向常数的常数型指针*/
int const* a const;

 

 

 

猜你喜欢

转载自blog.csdn.net/weixin_40288381/article/details/81084149
今日推荐