define的一些小技巧,相信很多人已经非常熟悉,并且经常用于声明一些函数或变量,最近在整理笔记,顺便把这个也记录下来。
define声明中的单"#"号:
define声明当中,有些变量前面单“#”号使用,这个的含义是让"#"后面的变量按照普通字符串来处理。来段实际代码:
#include <stdio.h>
#include <iostream>
using namespace std;
#define to_str(s) #s
int main()
{
cout << to_str(hello) << endl;
}
运行结果:hello
上面这段代码当中,使用define声明了一个to_str函数,我们将一个没带引号的hello传递进去,这在正常的函数当中是不允许的,因为编译器找不到hello的变量。而在define声明的to_str函数当中,通过"#"号,将传递进去的hello转为为一个普通的字符串,所以上述的代码等同于如下代码:
cout << "hello" << endl;
define声明当中的双“#”号:
define声明当中,除了单“#”号,还有双“#”号的使用。双“#”号可以理解为,在单“#”号的基础上,增加了连接功能,来段实际代码:
#include <stdio.h>
#include <iostream>
using namespace std;
#define test_print(n) printf("value"#n" = %d\n ", value##n )
int main()
{
int value1 = 1;
test_print(1);
}
运行结果:value1 = 1
这里我们很明显能看到,第一个单“#”号,作为一个字符串使用,拼接在value字符串后面,而之后的双“#”号则起到连接作用,将n代表的1与value连接,代表了value1变量。
value##n - > value1
当然,这么使用的前提是我们要提前声明好value1变量。
define的小技巧可以方便我们建立各种各样的函数与声明,并且利用一些全局的变量,灵活的调整代码的版本。