C++(十)之C语言中#define的缺陷

本文探讨了C语言中#define预处理器指令的不足之处,包括类型安全问题、宏展开的副作用以及在复杂表达式中的困难。通过对比,强调了C++中const常量和枚举类型的优越性,提倡使用更安全的替代方案。
/****************************************************
 * 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;
} 

结果:

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值