- 单个#
引例1.
#include<stdio.h>
#define P(x) printf("%s=%d\n",#x,x)
int main(){
/* #x 的作用就是把x转成"x",转成字符串*/
int a1=10,a2=20,a3=30;
P(a1); // 打印 a1=10
P(a2); // 打印 a2=20
P(a3); // 打印 a3=30
return 0;
}
引例2
#include<stdio.h>
#define printFUN(x) printf("%s",#x)
void gogogo() /* 在函数里面打印函数名 */
{
//printf("%s",gogogo); //打印出乱码
printFUN(gogogo); // 打印出 "gogogo"
}
int main(){
//函数名只是函数地址
gogogo();
return 0;
}
2.两个 ##
引例1
#include<stdio.h>
#define PP(x) printf##x
void printf1(){
printf("1111\n");
}
void printf2(){
printf("2222\n");
}
void printf3(){
printf("3333\n");
}
int main(){
// ## 相当于把 printf 和 x 连接成printfx
PP(1)(); // PP(1) 等价于 printf1
// PP(1)()等价于 printf1()
PP(2)();
PP(3)();
return 0;
}
引例2
#include<stdio.h>
#define P(x) printf("%s=%d\n",#x,x)
#define I(x) I##x
int main(){
int I(1)=11,I(2)=22,I(3)=33;
I1=100; //I1 等价于 I(1),I(1)值也改变
I2=200;
I3=300;
P(I(1)); // 打印出 I(1)=100
P(I(2)); // 打印出 I(2)=200
P(I(3)); // 打印出 I(3)=300
return 0;
}
3.宏变量
宏变量主要有
__FILE__ :宏在预编译时会替换成 当前程序的文件名
__LINE__ :宏在预编译时会替换成 当前行数
__FUNCTION__:宏在预编译时会替换成 当前的函数名称
#include<stdio.h>
#include<stdlib.h>
void sss(){
printf("Function:%s\n",__FUNCTION__); //打印结果为 "sss"
}
int main(){
//myprintf();
printf("Function:%s\n",__FUNCTION__);
sss();
printf("File:%s\n",__FILE__);
printf("Line:%d\n",__LINE__);
return 0;
}
打印的结果
Function:main
Function:sss
File:E:\Code2017\test2.cpp
Line:13
4.__VA_ARGS__ 可变参数宏
#include<stdio.h>
#define myprint(fm,...) printf(fm,__VA_ARGS__)
int main(){
int a=10;
myprint("hello %d\n",a);
//但是如果没有参数的话, 会报错,如下
//myprint("hello ");
return 0;
}
这里,如果可变参数被忽略或为空,’##’操作将使预处理器(preprocessor)去除掉它前面的那个逗号
因此应该改为
#include<stdio.h>
#define myprint(fm,...) printf(fm,##__VA_ARGS__) //加上##
int main(){
//int a=10;
myprint("hello \n");
return 0;
}