当前位置:网站首页 > C++编程 > 正文

C++宏编程技巧_宏程序实例100例

下面的代码并非按照规范格式来写,仅作示范用途。

常用符号

连接符,可将多个标识符拼接起来,组成一个完整的标识符。

//定义宏,用来打印整型变量 #define PRINT(x) printf("%d\n", ax) int a1 = 1; int a2 = 2; PRINT(1); //等同于printf("%d\n", a1),输出1 PRINT(2); //等同于printf("%d\n", a2),输出2
  • #

添加双引号,转成字符串。

//定义宏,转成字符串 #define STR(x) #x //等同于printf("%s\n", "Hello, world!"); printf("%s\n", STR(Hello, world!));
  • #@ 

添加单引号,转成字符。

//定义宏,将x转成字符 #define CH(x) #@x char a = CH(M); //等同于char a = 'M' printf("%c\n", a);

除了这些基本符号以外,还有一些巧妙使用技巧。

可以利用宏来完成注册类功能的实现。

高阶技巧

  • 注册类

在微软的MFC框架中,时常可以见到窗口注册类的身影。

通过API将用户自定义的类注册一下,便可以使用它们执行某些特定的功能。

这里我要介绍的是,自定义注册方法和调用类的方法,将用户自定义类注册成功后就可以通过类名来获取该类的对象,这在没有反射机制的C++中是十分有用的功能。

  • 用户可以用map容器存储['A', func]键值对,实现类与特定函数一一对应关系。
  • 规定注册类的权限,只有注册后才能执行某些操作。
  • 将类名字符串保存在数组中,使用for循环语句或if...else条件语句动态创建所需的类。

下面对注册类的一种简单使用进行举例:

//定义用来生成类、注册类的宏 //组合类名 #define CLS(x) Myx //创建注册类 #define CREATE_CLS(x) \ class CLS(x) : public RegCls \ { \ public: \ CLS(x) *Instance() \ { \ static CLS(x) *pInstance = new CLS(x); \ if (pInstance == nullptr) \ { \ pInstance = new CLS(x); \ } \ return pInstance; \ } \ } //使用类名进行类注册,#x用来将类名转成字符串 #define REG(x) \ CREATE_CLS(x) \ g_ClsMap[#x] = CLS(x)::Instance

 其中g_ClsMap是全局变量,需要自定义。

“\”符号用来连接多行代码,表明它们属于同一个宏定义。

CLS(x)用来组合连接类名,生成标识符Myx,如CLS(Dog)会产生标识符MyDog。

下面定义方法来调用注册类:

//定义类型func,返回RegCls *类型,无参函数 typedef std::function<RegCls *()> func; //定义全局map变量,保存类名字符串和获取单例的函数指针 std::map<string, func> g_ClsMap; //注册两个类,类名分别为MyDog和MyCat REG(Dog); REG(Cat); //使用"Dog"和"Cat"字符串获取类的单例对象 RegCls *pDog = g_ClsMap["Dog"](); RegCls *pCat = g_ClsMap["Cat"]();

本人在使用宏的过程中,还总结了一个可简化代码的宏使用技巧。

相信在编程过程中,经常会遇到相似代码重复多次出现的情况,显然宏就是为这种重复工作而生的东东。

举例如下:

//fd为文件描述符,以只读模式打开a.txt文件 int fd = open("a.txt", O_RDONLY); if (fd < 0) { cout << "open failed\n"; return -1; } //读取fd所指的文件内容,并保存在buf中 int res = read(fd, buf, sizeof(buf)); if (res < 0) { cout << "read failed\n"; return -1; }

上面是Linux系统中常见的打开文件并读取文件内容的操作,可发现判断返回结果的代码都是类似的,很容易联想到使用宏进行简化。其实宏定义的位置也有讲究,不仅可在文件头部定义,也可以在函数内部定义。无论在函数内部还是外部定义宏,都可以在之后使用该宏,作用域均为全局范围。

通过#define和#undef组合,可以将宏作用域限制在标签之间。

使用宏简化代码如下:

//定义宏,检查变量值 #define CHECK(x, str) \ if (x < 0) \ { \ cout << str << " failed\n"; \ return -1; \ } int fd = open("a.txt", O_RDONLY); CHECK(fd, "open"); int res = read(fd, buf, sizeof(buf)); CHECK(res, "read"); //取消宏定义 #undef CHECK

这段代码可以放到函数内部,用时定义,用完即销。

咦!为啥代码行数反而增加了!其实不然,这里我们定义的宏只用到了两次,所以效果不佳,但当使用次数增加到3次、10次甚至更多时,宏的作用将会体现得淋漓尽致! 

本次关于宏的介绍就到此为止,如有不对之处,请多多指教!

关于我


> 我是一位喜欢创新、乐观向上的少年
> 爱好是看书、踢足球、玩LOL等
> 喜欢我的文章的朋友,可以添加个人微信:`CS-huo`
> 有问题可以相互探讨,共同学习!

到此这篇C++宏编程技巧_宏程序实例100例的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • C++这么难,为什么我们还要学习C++?2024-11-13 21:36:08
  • C++编程简介_什么是计算机编程2024-11-13 21:36:08
  • 编c++的软件_编程软件c++2024-11-13 21:36:08
  • linux c++开发书籍_c++哪本书适合初学者2024-11-13 21:36:08
  • c++教程目录_c语言目录2024-11-13 21:36:08
  • 50道C/C++编程练习题 复习必备(1-10)2024-11-13 21:36:08
  • c++开发软件实例教程视频_c++基础知识入门2024-11-13 21:36:08
  • c++ 少儿编程_零基础编程2024-11-13 21:36:08
  • C++学习笔记(二、C++基本概念)2024-11-13 21:36:08
  • C++学习笔记(二、C++基本概念)2024-11-13 21:36:08
  • 全屏图片