zt指令c语言,C语言编程艺术--条件编译(zt)

默认版本

#endif

这样,你只需修改一下数字就可以完成版本的选择了

看来好像用#if 比较好了,试想如下情况:你写了一个配置文件叫做config.h用来配置一些宏,通过这些宏来控制代码,如你在config.h的宏

#define MY_PRINTF_EN 1

来控制是否需要编译自己的printf函数,

而在你的源代码文件printf.c中有如下指令

#i nclude "config.h"

#if MY_PRINTF_EN == 1

int printf(char* fmt, char* args, ...)

{ ...

}

#endif

但这样也会有一个问题,就是如果你忘了在config.h中添加宏MY_PRINTF_EN,那么自己写的printf函数也不会被编译,有些编译器会给出警告:MY_PRINTF_EN未定义。如果你有两个版本的想有一个默认版本,可以在printf.c中这样实现

#incldue "config.h"

#if !defined(MY_PRINTF_VERSION)

#define MY_PRINTF_VERSION   1

#endif

#if MY_PRINTF_VERSION == 1

void printf(*str) // 向终端简单地输出一个字符串

{...

}

#elif MY_PRINTF_VERSION == 2

int printf(char* fmt, char* args, ...)

{...

}

#elif MY_PRINTF_VERSION == 3

int printf(unsigned char com_number, char* str)

{

}

#endif

这种情况下还得用到#ifdef或#if defined(),你可以不用动主体的任何代码,只需要修改printf.c文件中MY_RPINTF_VERSION宏的数字就可以改变了,如果用前面那种方法还得拖动代码,在拖动中就有可能造成错误。

再试想,如果软件升级了,或者有了大的改动,原来有三个版本,现在只剩下两个版本了,如

#if MY_PRINTF_VERSION == 2

int printf(char* fmt, char* args, ...)

{...

}

#elif MY_PRINTF_VERSION == 3

int printf(unsigned char com_number, char* str)

{

}

#endif

因为这些核心代码不想让使用这些代码的人关心,他们只需要修改config.h文件,那就要在printf.c中实现兼容性。如果以前有人在config.h配置宏MY_PRINTF_VERSION为1,即有

#define MY_PRINTF_VERSION   1

而现在没有1版本了,要想兼容怎么办?那当然可以用更复杂的条件实现如:

#if MY_PRINTF_VERSION == 2 || MY_PRINTF_VERSION == 1

int printf(char* fmt, char* args, ...)

{...

}

#elif MY_PRINTF_VERSION == 3

int printf(unsigned char com_number, char* str)

{

}

#endif

不过还有另外一种方法,即使用#undef命令

#if MY_PRINTF_VERSION == 1

#undef MY_PRINTF_VERSION

#define MY_PRINTF_VERSION  2

#endif

#if MY_PRINTF_VERSION == 2

int printf(char* fmt, char* args, ...)

{...

}

#elif MY_PRINTF_VERSION == 3

int printf(unsigned char com_number, char* str)

{

}

#endif

用#if还有一个好处,如果你把宏名记错了,把MY_PRINTF_EN定义成了MY_PRINT_EN,那么你用#ifdef MY_PRINTF_EN或者#if defined(MY_PRINTF_EN)控制的代码就不能被编译,查起来又不好查,用#if MY_PRINTF_EN ==1控制就很好查,因为你把MY_PRINTF_EN定义成MY_PRINT_EN,则MY_PRINTF_EN实际上没有定义,那么编译器会给出警告#if MY_PRINTF_EN == 1中的MY_PRINTF_EN没有定义,但错就比较快。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值