本文已参与「新人创作礼」活动,一起开启掘金创作之路。
未曾了解过的一些知识!
- 宏定义在纯C代码中的使用非常广泛,同样在C++中也使用很广泛,比如socket中的操作fdset的几个接口均是出自宏定义。同样的,由于宏定义不做参数类型检查和符号检查,因此很适合对一些同类型的操作进行。
- 除此之外,
#
和##
在宏定义中还有一个很重要的用法,就是连接和“取属性”。这一操作的使用场景虽然有限,但是仍然是我们在学习C/C++的宏定义时必不可少的一个知识点。
#
的用法——参数字符串化
宏定义中#
的作用就是取变量名的字符串形式
demo for #
#define one(var) #var
int main()
{
int nVar = 1;
cout << "#var = (" << one(nVar) << ')' << endl;
}
输出如下所示:
#var = (nVar)
请按任意键继续. . .
请按任意键继续. . .
demo for #
编译前:
#include <stdio.h>
#define P(EXP) printf("%s %d\n", #EXP, EXP)
int main()
{
int a=123;
P(a);
return 0;
}
编译后:
#define P(EXP) printf("%s %d\n", #EXP, EXP)
int main()
{
int a=123;
printf("%s %d\n", "a", a);
return 0;
}
##
的用法——连接符
##
的作用是连接变量名
demo for ##
#define _double(var) nVar##1
int main()
{
int nVar1 = 1;
cout << "nvar##1 = (" << _double(1) << ')' << endl;
}
输出如下所示:
nvar##1 = (1)
请按任意键继续. . .
请按任意键继续. . .
demo for ##
编译前:
#include <stdio.h>
#define V(x) var##x
int main()
{
int var1=123,var2=222,var3=321;
printf("%d\n",V(1));
printf("%d\n",V(2));
printf("%d\n",V(3));
return 0;
}
编译后:
#define V(x) var##x
int main()
{
int var1=123,var2=222,var3=321;
printf("%d\n",var1);
printf("%d\n",var2);
printf("%d\n",var3);
return 0;
}
需要注意的是
只能使用常量,不能使用变量的值,宏也不会进行展开操作
以下为错误操作:
#include <stdio.h> #define V(x) var##x #define P 1 int main() { int var1=123,var2=222,var3=321; printf("%d\n",V(P)); return 0; }
#include <stdio.h> #define V(x) var##x int main() { int P=1; int var1=123,var2=222,var3=321; printf("%d\n",V(P)); return 0; }