码迷,mamicode.com
首页 > 其他好文 > 详细

define可变参数,float数据传输

时间:2017-05-05 12:51:13      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:可读性   错误   接受   第一条   处理   软件   可变   har   编译   

 

define可变参数

一般在调试打印Debug信息的时候, 需要可变参数的宏. C99开始可以使编译器标准支持可变参数宏(variadic macros), 另外GCC也支持可变参数宏, 但是两种在细节上可能存在区别.  

1. __VA_ARGS__  

/*__VA_ARGS__ "..." 传递给宏 . */

#define debug(format, ...) fprintf(stderr, format, __VA_ARGS__)

2. GCC的复杂宏    

/*GCC使用一种不同的语法,从而可以给可变参数一个名字,如同其它参数一样.*/

  #define debug(format, args...) fprintf (stderr, format, args)

/* 这和第一条的宏例子是完全一样的,但是这么写可读性更强并且更容易进行描述. */

3. ##__VA_ARGS__  

/* 上面两个定义的宏,如果出现 debug("A Message")的时候,由于宏展开后有个多余的逗号,所以将导致编译错误.为了解决这个问题,CPP 使用一个特殊的"##"操作,格式如下:  */

     #define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)

/* 这里,如果可变参数被忽略或为空,"##"操作将使预处理器(preprocessor)去除掉它前面的那个逗号. */

2 float类型数据的传输

技术分享

/* float型数据直接按照int型类似的发送肯定是不行的,这就需要采用指针的方法:*/

void float_char(float f,unsigned char *s)

{

   unsigned char *p;

   p = (unsigned char *)&f;

    *s = *p;

    *(s+1) = *(p+1);

    *(s+2) = *(p+2);

    *(s+3) = *(p+3);

}

/* 通过这种方法把数组s发送出去,在接受端接受到的就是标准的IEEE754结构的原始数据,也就是float型数据在内存中存放的值,如果需要得到这个float型数据的值还需要进行一个转换。

    这种方法比较简单明了,这时候的串口接收端可以用现成的,不需要自己编写。 */

技术分享

/*还可以采用共用体的方法,如果采用共用体时串口的接收端软件需要自己编写。我们知道共用体可以使不同的数据类型来共享相同的地址空间,所以程序如下:*/

void float_char(float f,unsigned char *s)

{

  union change  {

        float d;

       unsigned char dat[4];

    } r1;

    r1.d = f;

    *s = r1.dat[0];

    *(s+1) = r1.dat[1];

    *(s+2) = r1.dat[2];

    *(s+3) = r1.dat[3]; 

}

/* 接收端采用同样的程序编写就可以得到float型数据的值了,不再需要其他的转换。 */

技术分享

/* 类似的,传输long型或int型时也可以采用共用体的方法: */

void long_char(unsigned long l,unsigned char *s)

{

   union change {

        long d;

     unsigned char dat[4];

    }r1;

   r1.d = l;

    *s = r1.dat[0];

    *(s+1) = r1.dat[1];

    *(s+2) = r1.dat[2];

    *(s+3) = r1.dat[3]; 

}

/*同时还有内存操作函数/调用库函数的方法,但这种方法对编译器要求过高*/

define可变参数,float数据传输

标签:可读性   错误   接受   第一条   处理   软件   可变   har   编译   

原文地址:http://www.cnblogs.com/younining/p/6812350.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!