diff --git a/README.md b/README.md index 2e99f93..516666b 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ - [x] [enum那些事](./enum) - [x] [decltype那些事](./decltype) - [x] [引用与指针那些事](./pointer_refer) +- [x] [宏那些事](./macro) 代码运行: 全部在linux下用vim编写,使用gcc/g++调试!全部可正常运行! diff --git a/macro/README.md b/macro/README.md new file mode 100644 index 0000000..d20b612 --- /dev/null +++ b/macro/README.md @@ -0,0 +1,232 @@ +# 宏那些事 + +## 关于作者: + +个人公众号: + +![](../img/wechat.jpg) + +## 1.宏中包含特殊符号 + +分为几种:`#`,`##`,`\` + +### 1.1 字符串化操作符(#) + +**在一个宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组**,换言之就是:**#是“字符串化”的意思,出现在宏定义中的#是把跟在后面的参数转换成一个字符串**。 + +**注意:其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。** + +例如: + +```c++ +#define exp(s) printf("test s is:%s\n",s) +#define exp1(s) printf("test s is:%s\n",#s) +#define exp2(s) #s +int main() { + exp("hello"); + exp1(hello); + + string str = exp2( bac ); + cout<(b) ? (a) \ + :(b)) +int main() { + int max_val = MAX(3,6); + cout<0) + fun() +``` + +这个宏被展开后就是: + +``` +if(a>0) + f1(); + f2(); +``` + +本意是a>0执行f1 f2,而实际是f2每次都会执行,所以就错误了。 + +为了解决这种问题,在写代码的时候,通常可以采用`{}`块。 + +如: + +```c++ +#define fun() {f1();f2();} +if(a>0) + fun(); +// 宏展开 +if(a>0) +{ + f1(); + f2(); +}; +``` + +但是会发现上述宏展开后多了一个分号,实际语法不太对。(虽然编译运行没问题,正常没分号)。 + +### 2.2避免使用goto控制流 + +在一些函数中,我们可能需要在return语句之前做一些清理工作,比如释放在函数开始处由malloc申请的内存空间,使用goto总是一种简单的方法: + +```c++ +int f() { + int *p = (int *)malloc(sizeof(int)); + *p = 10; + cout<<*p< + diff --git a/macro/do_while b/macro/do_while new file mode 100755 index 0000000..ce87035 Binary files /dev/null and b/macro/do_while differ diff --git a/macro/do_while.cpp b/macro/do_while.cpp new file mode 100644 index 0000000..68af132 --- /dev/null +++ b/macro/do_while.cpp @@ -0,0 +1,76 @@ +#include +#include + +using namespace std; +#define f1() cout<<"f1()"<0) + fun(); + + if(2>0) + fun1(); + + f(); + ff(); + fc(); + return 0; +} diff --git a/macro/sig_examp b/macro/sig_examp new file mode 100755 index 0000000..b342360 Binary files /dev/null and b/macro/sig_examp differ diff --git a/macro/sig_examp.cpp b/macro/sig_examp.cpp new file mode 100644 index 0000000..85290a7 --- /dev/null +++ b/macro/sig_examp.cpp @@ -0,0 +1,86 @@ +#include +#include +#include +#include + +using namespace std; + +///=========================================== +/** + * (#)字符串操作符 + */ +///=========================================== +#define exp(s) printf("test s is:%s\n",s) +#define exp1(s) printf("test s is:%s\n",#s) + +#define exp2(s) #s + + +///=========================================== +/** + *(##)符号连接操作符 + */ +///=========================================== +#define expA(s) printf("前缀加上后的字符串为:%s\n",gc_##s) //gc_s必须存在 + +#define expB(s) printf("前缀加上后的字符串为:%s\n",gc_ ## s) //gc_s必须存在 + +#define gc_hello1 "I am gc_hello1" + + +///=========================================== +/** + * (\)续行操作符 + */ +///=========================================== +#define MAX(a,b) ((a)>(b) ? (a) \ + :(b)) + +int main() { + ///=========================================== + /** + * (#)字符串操作符 + */ + ///=========================================== + exp("hello"); + exp1(hello); + + string str = exp2( bac ); + cout<