免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2345 | 回复: 4
打印 上一主题 下一主题

[C++] [转] C++11这些令人无比愉悦的改变(9) -- 自定义数据 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-17 14:42 |只看该作者 |倒序浏览
写嵌入式的程序员,成天跟二进制/16进制打交道,
某些时候,您可能会想,能不能直接给出一个二进制值呢,
比如
unsigned int n = 11110000b;  /* 11110000b表示二进制的一个值 */

在C++11之前,做不到这一点,只好老实一点,比如用16进制写
unsigned int n = 0xF0;

C++11就不一样了,可以自定义一个后缀的标识来处理这件事。
这个例子里,可以自定义一个跟后缀b相关联的函数
   unsigned int operator "" b(const char *binstr) { ..... }
这个函数,它的输入参数就是 11110000这样的字符串,
把当它二进制处理后,输出一个值为0xF0的整数。

有了这个函数,后面的代码就可以这样直接写了,非常方便。

  1. #include <stdio.h>
  2. #include <stdexcept>

  3. unsigned int operator "" b(const char *binstr)
  4. {
  5.     size_t len = 0;
  6.     unsigned int v = 0;
  7.     for(; *binstr != '\0'; ++binstr)
  8.     {
  9.         /* 检测二进制数字的长度,是否超过一个32 bit ? */
  10.         if(len >= sizeof(v) * 8)
  11.              throw std::runtime_error("too long length of binary value");

  12.         /* 移位赋值,将字符串当作二进制数转成整数 */
  13.         v <<= 1;
  14.         if(*binstr == '1')
  15.             v |= 1;
  16.         else if(*binstr == '0')
  17.             ;        /* Do nothing */
  18.         else
  19.             throw std::runtime_error("invalid binary value format");
  20.     }
  21.     return v;
  22. }

  23. int main()
  24. {
  25.     unsigned int n = 11110000b;
  26.     printf("%x\n", n);        /* 输出 f0 */

  27.     return 0;
  28. }
复制代码
但是哦,理想是美好的,现实是残酷的,
要使用这么绚丽的功能,恐怕还要加以时日,等待编译器厂家的进步。
上面这段代码,也是笔者随意写的,未经任何编译器证实:)

笔者试验gcc 4.5.2 和 VC 2010支持的C++11功能,
都还不支持这种自定义数据的写法。(2011/11/17日试验)

(转载请注明来自:nuvoton-m0.com)

论坛徽章:
0
2 [报告]
发表于 2011-11-18 10:37 |只看该作者
这些特性其实蛮蛋疼的

论坛徽章:
0
3 [报告]
发表于 2011-11-18 11:08 |只看该作者
这个太损害性能了

论坛徽章:
0
4 [报告]
发表于 2011-11-18 11:09 |只看该作者
既然是新特性,为何不要求编译器在编译时来实现呢?

论坛徽章:
0
5 [报告]
发表于 2011-11-18 11:27 |只看该作者
据说g++4.7可用。
http://tieba.baidu.com/p/1286035203
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP