/****************************************************
* brief : #define的一些缺陷
* author : shao
* date : 2020-02-24
* note : none
*
****************************************************/
#include <stdio.h>
/*
* 注: #define的作用域是从定义开始的地方直到本文件的结尾
* 或者用#undef来结束当前#define
*/
//==========================1.拓展带来的隐患====================================
#define ADD(x, y) x+y
#define ADD1(x, y) ((x) + (y))
void test01(void)
{
int ret1 = ADD(10, 20)*10; //这里的期望结果是300
int ret2 = ADD1(10, 20)*10;
printf("ret1 = %d\n", ret1);
printf("ret2 = %d\n", ret2);
}
/*
* 解析:宏定义在预编译的时候,已经替换了原来的ADD(x, y)
* 取代的是x+y.
* 所以在编译的时候,ADD(10, 20)*10替换成10+20*10
* 故最终结果是210
* 所以如果我们要解决该问题,需要向ADD1加上()
*
*/
//==============================================================================
//==========================2.避免不了的语法错误================================
#define COMPARE(x, y) ((x) < (y) ? (x) : (y))
void test02(void)
{
int a = 1;
int b = 4;
printf("COMPARE(x, y) = %d\n", COMPARE(++a, b));
}
/*
* 解析:在这里我们预计的是,++a < b,那么返回a.
* 这个时候返回的a应该是2.但是实际情况是3
* 原因是: COMPARE(++a, b) =
* (++a) < b ? (++a) : b。所以到这里,++a < b
* 所以返回++a的时候又被执行了一次,所以2变3
*/
//==============================================================================
int main(void)
{
printf("//==========================1.拓展带来的隐患====================================");
test01();
printf("//==========================2.避免不了的语法错误================================");
test02();
return 0;
}
结果:
本文探讨了C语言中#define预处理器指令的不足之处,包括类型安全问题、宏展开的副作用以及在复杂表达式中的困难。通过对比,强调了C++中const常量和枚举类型的优越性,提倡使用更安全的替代方案。

4957

被折叠的 条评论
为什么被折叠?



