1、预定义的宏
在C语言中预定义了一些宏,这些宏主要提供当前编译的信息。 这些宏的名字都是以两个下划线字符开始和结束的。
例如:“__FUNCTION__”用于表示当前所在函数名,它实际上是一个代码块作用域变量,而不是一个宏,它提供了外层函数的名称,用于程序调试和异常信息报告。
2、带参数的宏
带参数的宏定义的格式如下:
#define 标识符(X1,X2,.....,Xn)替换列表
其中,x1,x2,,Xn是标识符(宏的参数),这些参数可以在替换列表中根据需要出现任意次。 宏命令总是在第一个换行符处结束,如果想在下一行继续宏命令,则必须在当前行的末尾使用“\”字符。 当预处理器遇到一个带参数的宏时,会将定义存储起来以便后面使用。
3、“#”运算符
“#”运算符将一个带宏的参数转换为字符串常量,它仅允许出现在带参数的宏的替换列表中。
测试代码:
#include<stdio.h>
#define PRINT_MANY(x,y,z) printf("%5d %5d %5d\n",x,y,z);
#define PRINT_INT(i) \
printf("%8s(): &%-5s=0x%-6x, %-5s=0x%-6x %-5d\n", __FUNCTION__, #i, &(i), #i, i, i);
int add(int a, int b)
{
PRINT_INT(a);
PRINT_INT(b);
return a+b;
}
int main()
{
int iNum1,iNum2,iNum3;
PRINT_MANY(iNum1,iNum2,iNum3);
PRINT_INT(iNum1);
add(iNum2,iNum3);
return 0;
}
测试输出: