宏定义的使用

2024-01-03 15:57:49

使用宏定义的好处:

1. 代码的可读性更高。

2. 更加方便代码修改。

1. 不带参数的宏定义?

#define NUB 20
#define STR "好好学习"

宏定义使用#define 预处理指令定义, 上面就是定义了两个宏。?

定义之后,代码在预处理阶段会将宏展开(就是简单的替换)?

int a  =  NUB; // 宏展开之后代码为 int a = 20;

printf("%s",STR); // 宏展开之后代码为, printf("%s","好好学习");

?

2.带参数的宏定义

#define x(i) i*i;

int a = x(2); // 宏展开之后,为int a = 2*2;

上图,就是使用了带参数的宏,其实使用时和函数带哦用类似,但是宏只是简单的替换,所以比函数要快的多。?

2.1. 使用#?

#define A(i) #i

printf("%s",A(好好学习)); // 宏展开之后-- printf("%s","好好学习");

#就是在宏展开(就是简单的替换的时候),给参数加上一个双引号。(如上图)?

2.2. 使用##

#define A(i) i##1;
#define A1(I) i##"学习"

int A(x) = 10; // 宏展开之后,int x1 = 10;

printf("%s",A1(”好好“)); // 宏展开之后, printf("%s","好好学习");

##就是在宏展开的时候,将参数和1链接起来,将两个字符串拼接了起来。

?

3. 宏定义注意事项?

1) 宏定义只是简单的替换而已 (#,##下也是相应的替换)

#define M(X)  #X
#define M1(x) x##"1"
#define M2(x) x##1

using namespace std;

int main(void)
{

	printf("%s", M1(x));  // 宏替换之后, printf("%s",x"1");

    printf("%s",M2(x)); // 宏替换后,printf("%s",x1);

	system("pause");

	return 0;
}

看上面代码,它只是进行了简单的替换,所以应该注意使用场景,比如第二个,我们输出字符串(可是它替换下来,不带"",只是一个变量名称,所以可以定义变量时这么用)? int M2(x) = 1; 宏展开后为int ?x2 = 1; // 定义了一个x2的变量

?

2)在用于计算时一定要注意先后顺序(建议加上括号)?

情况一:?

#define M(i) i+i

int a = M(1)*2; // 宏替换之后. int a = 1+1*2; = 3


// 改进

#define M(i) (i+i)

int a = M(1)*2; // 宏替换之后. int a = (1+1)*2; = 4

看上面代码,我们本来想计算(1+1)*2,但是,由于宏是简单的替换,只是将1+1换下来了,换下来计算的顺序就变了,结果变为了3。可以根据,上面代码改进。???

情况二:?

#define M(i) i*5

int a = M(1+1); // 宏替换之后. int a = 1+1*5; = 6


// 改进

#define M(i) (i)*5

int a = M(1+1); // 宏替换之后. int a = (1+1)*5; = 10

上面代码类似,也是加括号?

所以建议:? 都加括号

#define M(i) ((i)*(i))

?

3) 如果宏定义比较长的话,可以使用\换行?。

// 换行顶格写(建议顶格写)

#define a "好好\
学习"   // 可以换行,这里需要顶格写

printf("%s",a);  // 输出 好好学习



// 换行不顶格写

#define a "好好\
          学习"   // 可以换行,这里没有顶格写(编译器可能标红线,但是你可以忽略,仍然可以通过编译)


// 这样输出,会将前面的空格也会输出

printf("%s",a);  // 输出 好好         学习

建议顶格写,因为不顶格写会导致输出中间的空格。(其实和输出时换行一个原理).?

?

?

?

?

?

?

?

?

?

?

?

文章来源:https://blog.csdn.net/weixin_68026222/article/details/135361432
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。