牛卧堂MCU技术交流
标题:
C++11这些令人无比愉悦的改变(9) -- 自定义数据
[打印本页]
作者:
admin
时间:
2013-12-24 10:01
标题:
C++11这些令人无比愉悦的改变(9) -- 自定义数据
写嵌入式的程序员,成天跟二进制/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的整数。
有了这个函数,后面的代码就可以这样直接写了,非常方便。
#include <stdio.h>
#include <stdexcept>
unsigned int operator "" b(const char *binstr)
{
size_t len = 0;
unsigned int v = 0;
for(; *binstr != '\0'; ++binstr)
{
/* 检测二进制数字的长度,是否超过一个32 bit ? */
if(len >= sizeof(v) * 8)
throw std::runtime_error("too long length of binary value");
/* 移位赋值,将字符串当作二进制数转成整数 */
v <<= 1;
if(*binstr == '1')
v |= 1;
else if(*binstr == '0')
; /* Do nothing */
else
throw std::runtime_error("invalid binary value format");
}
return v;
}
int main()
{
unsigned int n = 11110000b;
printf("%x\n", n); /* 输出 f0 */
return 0;
}
复制代码
但是哦,理想是美好的,现实是残酷的,
要使用这么绚丽的功能,恐怕还要加以时日,等待编译器厂家的进步。
上面这段代码,也是笔者随意写的,未经任何编译器证实:)
笔者试验gcc 4.5.2 和 VC 2010支持的C++11功能,
都还不支持这种自定义数据的写法。(2011/11/17日试验)
(转载请注明来自:nuvoton-m0.com)
欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/)
Powered by Discuz! X3.2