当前位置: 代码迷 >> 综合 >> 【C语言】【预处理】#if、#ifdef、#ifeq的区别及应用
  详细解决方案

【C语言】【预处理】#if、#ifdef、#ifeq的区别及应用

热度:89   发布时间:2023-12-15 12:50:23.0

#if和#ifdef的区别与联系

  • 比较容易混淆的是#if和#ifdef,可参考下微软网站的解释:
  • You can use the #ifdef and #ifndef directives anywhere #if can be used.
  • The #ifdef identifier statement is equivalent to #if 1 when identifier has been defined. It’s equivalent to #if 0 when identifier
    hasn’t been defined, or has been undefined by the #undef directive.
  • 二者区别可参考下面表格:
#if #ifdef
后面跟“整型常量表达式” 后面跟一个宏名
判断后面的表达式的值(是否为非0值) 判断后面的标识符有没有定义
后面值为非0,结果为true 后面的标识符定义过,结果为true
配合#elif、#else使用 配合#else使用
可支持多条件,如配合defined使用 仅可支持 一个条件
  • 二者的联系:
> #ifdef   XXX   = #if defined(XXX)
> #ifndef  XXX   = #if !defined(XXX)

#ifeq的用法

  • 常见用法:
ifeq ($(X_MODULE_DEBUG_ENABLE),1)
ifeq ($(X_MODULE_DEBUG_ENABLE),y)
  • 一般用于判断后面判断后面两个参数是否相等,相等为 true,不相等则为 false;
  • 格式与#if、#ifdef不同,所以不容易混淆;

一个例子

  • C语言.c或.h文件中定义宏:
#define X_MODULE_DEBUG_ENABLE 
#define X_MODULE_DEBUG_ENABLE=y 
#define X_MODULE_DEBUG_ENABLE=1 
#define X_MODULE_DEBUG_ENABLE=0 
  • makefie中定义宏:
- export X_MODULE_DEBUG_ENABLE=y  
- export X_MODULE_DEBUG_ENABLE=1  
- export X_MODULE_DEBUG_ENABLE=0  
- -DX_MODULE_DEBUG_ENABLE=y       
- -DX_MODULE_DEBUG_ENABLE=1       
- -DX_MODULE_DEBUG_ENABLE=0       
  • 一个预处理指令应用的代码段:
#if X_MODULE_DEBUG_ENABLE //X_MODULE_DEBUG_ENABLE为非0值,为TRUE
//#ifeq(X_MODULE_DEBUG_ENABLE,1) //X_MODULE_DEBUG_ENABLE=1,为TRUE
//#ifeq(X_MODULE_DEBUG_ENABLE,y) //X_MODULE_DEBUG_ENABLE=y,为TRUE
//#ifdef X_MODULE_DEBUG_ENABLE //X_MODULE_DEBUG_ENABLE定义了,为TRUE
#define LOG_TAG "[ES7243]: %s() line: %d " 
#define X_MODULE_Log(fmt, args...) printk(KERN_INFO LOG_TAG fmt, __FUNCTION__, __LINE__, ##args)
#else
#define X_MODULE_Log(fmt, args...) 
#endif

各位读者,可试下前面不同定义宏的方式和后面代码段如何配合使用。

参考资料:

  • #ifdef and #ifndef Directives (C/C++)
  • The C Preprocessor

如本文对你有些许帮助,欢迎大佬打赏:
支付宝打赏方式及我的购物小店