#define 宏定义类面试题目的全类型总结—预处理、const、static与sizeof(一)

目录

 

#define 宏定义的使用

宏定义的经验总结

宏定义的二义性歧义

如何使用宏定义连接参数

 #ifdef、#else、#endif在程序中的使用


#define 宏定义的使用

宏的本质是简单的文本替换。

如下,表示的是x和y的比较最大值和最小值的宏替换定义:

#define MAX(x,y) (((x)>(y))?(x):(y));
#define MIN(x,y) (((x)<(y))?(x):(y));

用的时候,也很简单,直接进行调用就行了:

#include <iostream>
#include <stdio.h>

#define MAX(x,y) (((x)>(y))?(x):(y));
#define MIN(x,y) (((x)<(y))?(x):(y));

int main()
{
	int x = 2, y = 8;
	printf("x = %d, y = %d\n", x, y);

	int MAX_result = MAX(x, y);
	printf("MAX_result:%d\n",MAX_result);

	int MIN_result = MAX(x, y);
	printf("MIN_result:%d\n", MIN_result);

	system("pause");
	return 0;
}

 运行结果:

宏定义的经验总结

  1. 宏定义语句后面,不用加逗号。
  2. 宏中需要把参数给小心地给用括号括起来,因为宏只是简单的文本替换,如果不注意,很容易引起二义性。
  3. 为什么上面要用三元运算符(?:)呢?这是因为,这个运算符可以起到比if-else更优化的代码,并且书写的也更简洁明了!
  4. 千万要注意,宏只是文本替换,不是函数表达式,什么意思呢?给你举个例子:
int main()
{
	int x = 2, y = 8;
	printf("x = %d, y = %d\n", x, y);

	//int MAX_result = MAX(x, y); 
	printf("MAX_result:%d\n", MAX(x, y)); //如果把中间变量MAX_result给去掉,直接把宏放在printf里面,是会报错的!

	system("pause");
	return 0;
}

还是上面的代码,只是修改了一下位置,就报错了,这是因为宏只是文本替换,如果把"Max(x,y)"放在了printf里面,就会出现错误。而想之前的,如果把一个函数放在里面,就不会出现,因为函数默认的返回一个结果,并让这个结果继续运行,而宏不会。 

宏定义的二义性歧义

比如,我下面想用宏定义来实现一个平方操作,如果按照正常的思路编写一个宏SQR1,那么得到的结果就不是我期望想得到的平方结果了!

#include <iostream>

#define SQR1(x) (x*x)
#define SQR2(x) ((x)*(x))

int main()
{
	int a = 2, b = 4;

	int result1 = SQR1(a+b); // 执行的是2+4*2+4 = 14
	printf("SQR1执行平方操作的结果:%d\n", result1);

	int result2 = SQR2(a+b); // 执行的是 (2+4)*(2+4) = 36
	printf("SQR2执行平方操作的结果:%d\n", result2);

	system("pause");
	return 0;
}

运行结果: 

再次强调,在定义宏的时候,一定要考虑宏的本质只是一个简单的文本替换,并不是函数,所以,该加括号的地方,一定要加,否则会出现二义性的歧义问题。

如何使用宏定义连接参数

那么,既然宏只是简单的文本替换,那么是否可以用宏的表示符号,来连接参数呢?

其实,就是"##"符号的使用

#include <iostream>

#define STR(s) #s
#define CONS(a,b) (int)(a##e##b)

int main()
{
	printf("%s",STR(vck)); //这样写可以
	printf("\n");

	printf(STR(vck)); //这样写也可以
	printf("\n");

	printf("%d", CONS(1, 2)); //1e2 ->10^2->100(1乘以10的2次方)
	printf("\n");

	system("pause");
	return 0;
}

 运行结果:

 #ifdef、#else、#endif在程序中的使用

"#ifdef ... #endif"之间的打印消息将不会输出出来。

比如下面的代码逻辑,先定义一个叫DEBUG的宏定义,然后,下面的(#ifdef DEBUG)如果存在一个名为DEBUG的宏定义,就执行#ifdef和#endif之间的语句,如果没有,就跳过。

#include <stdio.h>
#include <stdlib.h>

#define DEBUG

int main()
{
	int i = 0;
	char c;
	while (1)
	{
		i++;
		c = getchar();
		if (c != '\n')
		{
			getchar();
		}
		if (c == 'q' || c == 'Q')
		{
#ifdef DEBUG
			printf("we got:%c, about to exit.\n", c);
#endif
			break;
		}
		else
		{
			printf("i = %d", i);
#ifdef DEBUG
			printf(", we got:%c", c);
#endif // DEBUG
			printf("\n");

		}
	}
	system("pause");
	return 0;
}

发布了271 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_17846375/article/details/104902578