C/C++中##和#宏

来源:互联网 发布:登陆艇升级数据 编辑:程序博客网 时间:2024/05/19 10:10

在c语言/c++中,宏(Macro)是属于编译时期(而非运行时期)的概念,采用关键字define进行定义。它只是一种简单的字符串替换,根据是否带参数分为无参和带参。

它的作用还是很大的,比如提高可移植性,可读性,方便性等等,常见就是替换变量,防止重复包含头文件等

#define MAX 10

#ifndef __HEAD_H__

#define __HEAD_H__

  //头文件内容

#endif

这些都不多提,今天主要总结一下我不太熟悉的宏特殊符号及惯用法即#和##。


首先是#,它是使用预处理器将一个宏参数转换为一个字符串,即#argument被翻译为“argument”。看下面一段代码:

#define N 10#define PRINT_MACRO(FORMAT, VALUE) \printf("the value of " #VALUE " is " FORMAT "\n", VALUE)#define TO_STRING(s) #sint main(){PRINT_MACRO("%d", N);printf("%s\n", TO_STRING(hello world));getchar();return 0;}

结果显示



而对于宏##,它是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。

#define CAT(a, b) a##bint main(){int aabb = 1;printf("%d\n", CAT(aa, bb));//相当于aabbgetchar();return 0;}


在C++中如果写个Test类,里面有多个形如_data1, _data2, _data3等私有成员变量以及对应的get/set函数,如果一个个写,发现太麻烦了,于是我们可以用##来实现一个简化写法,具体如下:

#define  GET_SET_PARAMETER_MACRO(type, name) \private: \type _##name; \public: \void set##name(type name) { _##name = name; } \type get##name() { return _##name; }class Test {GET_SET_PARAMETER_MACRO(int, data1);GET_SET_PARAMETER_MACRO(int, data2);};int main(){Test a;a.setdata1(1);cout << a.getdata1() << endl;a.setdata2(2);cout << a.getdata2() << endl;getchar();return 0;}





0 0
原创粉丝点击