C预处理

#define 

与所有预处理指令一亮,预处理指令#define用#符号作为行的开头,#和指令之间不能有空格,指令可以出现在源文件的任何地方。指令定义的作用域从定义出现的位置开始直到文件的结尾。#define由三部分组成:第一部分为指令#define自身第二部分为所选择的缩略语,这些缩略语称为宏macro ,(宏的名字不能有空格)只能使用字母、数字、下划线,第一个不能是数字,第三部分#define行的其余部分,称为替换列表或主体。

接下来看看代码了解一下吧

#include<stdio.h>
#define two 2
#define ow "aaaaaa "
#define ows"aabb
ccdd" //通过下划线转到下一行
#define four two*two
#define Px printf("x is %d .
",x);
#define fmt "x is %d.
"
int main(void){
int x=two;
px;
x=four;
printf(fmt,x);
printf("%s
",ow);
printf("%s
",ows);
printf("wo:ow "); return 0; }

运行后:

x is 2.

x is 4.

aaaaaa

aabbccdd

wo:ow

C预处理器中的语言符号是宏定义主体的单独的词“word”,用空白字符把这些词分开。例如:

#define fout 2*2

定义中有一个语言符号:即序号2*2但是:#define six 2*3

这个定义中有三个语言符号:2 * 3 

#include<stdio.h>
#define psor(x) printf("The square of "#x"is %d .
",((x)*(x)));
int main(void){
int y=5;
psor(y);
psor(2+4);
return 0;
}

 运行结果:

The square of y is 25.

The square of 2+4 is 36.

第一次调用宏时,用"y"代替#x,第二次调用宏时,用“2+4”代替#x,

例如第一次调用:The square of y is ((y)*(y));

##运算符

和#运算符一样,##运算符可以用于类函数宏的替换部分,另外##还可用于类对象宏的替换部分。这个运算符把两个语言符号组合成单个符号。

接下来看一下代码:

#include<stdio.h>
#define  XNAME(n) x##n
#define  PRINT(n)printf("x" #n"=%d
",x##n);
int main(void){
int XNAME(1)=14;//变为 int x1=14;
int XNAME(2)=20;//变成 int x2 =20;
PRINT(1); /变成printf("x1=%d n",x1);
PRINT(2);
return 0;
}

可变宏: ...和_ _ VA_ARGS_ _

有些函数(如printf())接受可变数量的参数。预定义宏 _ _ VA_ARGS_ _就可以被用在替换部分中,一表明省略号代表什么。

#include<stdio.h>
#include<math.c>
#define PR(x,...)printf("Message“#x”:"_ _ VA_ARGS)
int main(void){
double x=48;
double y;
y=sqrt(x);
PR=(1,"x=%g
",x);
PR=(2,"x=%d.2f,y=%.4f
",x,y);
retrun 0;
}

 运行结果:

Message 1:x=48

Message 2:x=48.00 y=6.928

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             

原文地址:https://www.cnblogs.com/X404/p/12213784.html