C语言宏定义与条件编译

简介: C语言宏定义与条件编译

一、定义一个标准宏

#define MAX_LEN 10

  1. 允许留有空格,但请不要写成下面这样,这看着很不舒服
  2. 宏的名字建议全部大写,单词与单词之间用 _ 连接,这是一个很好的规范
  3. 最后不要加分号

二、带未知数的宏定义

# define SUM(x)   (x)+(x)

int main()

{

   printf("%d\n", SUM(10));

   printf("SUM(20)\n");

   return 0;

}

编译器会将SUM(x),进行简单的宏替换,不会自动给加括号等 !!!

还是用上面的宏,这个结果会是什么呢

printf("%d\n", SUM(10)*2);         // 输出30     替换为10+10*2

三、宏在哪里可以定义

结论:并非要在开头,哪里都可以定义宏,无论是函数里,函数外,代码快里等等

#define OUT_DEF 10

int main() {

#define IN_DEF 20

   printf("%d %d", OUT_DEF, IN_DEF);

   return 0;

}

四、何时进行宏替换

一份C语言代码变为可执行程序的四个步骤

  • 预处理:去注释、宏替换、条件编译 (去注释先于宏替换)
  • 编译:将C语言转为汇编语言
  • 汇编:汇编语言转为二进制文件(不可被执行)
  • 链接:自身文件与库文件关联,形成可执行程序          

不要企图用宏充当注释,因为去注释先于宏替换,相当于你定义了一个为空的宏

#define NO_EXE //

五、宏的有效范围

结论:从宏定义处开始,只对他下面的代码起作用

因为函数调用是在编译时进行的而宏替换是在预处理阶段

当宏替换时还没解释show函数,编译器编译时不认识M

六、宏定义多语句

结论:用do{}while(0)封装。为什么呢?

#define INTI_RECT_VALUE(a, b) \

do{\

   printf("before:%d %d\n", a, b);\

   a=0;\

   b=0;\

   printf("after:%d %d\n", a, b);\

}while(0)

1.该宏在if,while结构中,只有一条语句,没加{ },报错

2.加了{ },最后会多一个分号,报错

当然现在的编译器都很强大可能给你自动优化

七、undefine取消宏

#define NUM 10

#undefine NUM

看题:

//程序输出结果
#define X 10
#define Y X+10
#undef X
#define X 20
int main() {
    int x = Y;
    printf("%d\n", x);
    return 0;
} 
// 输出30

宏就是简单的替换,Y替换为X+10,X替换为20

八、宏中的# 与 ##

结论:

#可将s里的内容转为字符串

##用于构建新符号

看两段代码

#define STR(s) #s //将s的内容替换为字符串
int main()
{
  printf("Pi:"STR(3.14)"\n");
  return 0;
}
#define TOSTRING(s) #s
int main()
{
  int a = 124;
  char *s = TOSTRING(a);
  printf(s);    // 输出a
  return 0;
}

代码一输出字符串“3.14”,代码二输出字符‘a’ 宏替换先于编译

## 构建新符号

#define XNAME(n) student##n
int main() {
  XNAME(1); //替换为student1;
  return 0;
}

九、条件编译

#ifdef 与 #if

  • #ifdef:检查宏是否被定义
  • #if:检查宏的结果是真是假
  • 条件编译用于裁剪代码,降低维护成本,例如一个软件企业版与社区版

1.  #ifdef …… #else……#endif (不常用)

//条件编译 #ifdef检查宏是否被定义
//这叫定义
#define M
int main()
{
#ifdef M
  printf("M is define\n");
#else
  printf("M is not define\n");
#endif
  return 0;
}

2.  #if……#else……#endif (常用)

    不定义走else,不赋值报错

#define M 1
int main()
{
#if M
  printf("M is true define\n");
#else
  printf("M is false define\n");
#endif
  return 0;
}
  • #ifdef可以被#if define()替换
  • #ifndef可以被#if !define()替换
  • 支持多条件判定
#define C
#define CPP
int main()
{
#if (defined(C) && defined(CPP))
  printf("C and CPP\n");
#else
  printf("other\n");
#endif
  return 0;
}

支持嵌套

#define C
#define CPP
int main()
{
#if defined(C)
  #if defined(CPP)
    printf("CPP\n");
  #endif
  printf("C\n");
#else
  printf("other\n");
#endif
  return 0;
}

欢迎大家指正!!!

相关文章
|
9月前
|
C语言
C语言使用宏定义实现等级调试输出PRINT_LEVEL
C语言使用宏定义实现等级调试输出PRINT_LEVEL
180 0
|
2月前
|
编译器 C语言
【C语言】宏定义详解
在C语言中,宏定义是一种强大的预处理器功能,用于在编译之前对代码进行替换和条件编译。宏定义通过预处理器指令进行定义和使用,能够使代码更加灵活和可维护。本文将对C语言中的宏定义进行全面的讲解,包括各种相关的预处理器指令及其用法。
147 7
|
2月前
|
编译器 C语言
【C语言】宏定义详解
宏定义(Macro Definition)是C语言预处理器的一部分,通过`#define`指令引入。宏定义在编译前的预处理阶段进行文本替换,即将代码中的宏名替换为定义的内容。
388 6
|
2月前
|
编译器 C语言
【C语言】宏定义在 a.c 中定义,如何在 b.c 中使用?
通过将宏定义放在头文件 `macros.h` 中,并在多个源文件中包含该头文件,我们能够在多个文件中共享宏定义。这种方法不仅提高了代码的重用性和一致性,还简化了维护和管理工作。本文通过具体示例展示了如何定义和使用宏定义,帮助读者更好地理解和应用宏定义的机制。
95 2
|
3月前
|
程序员 编译器 C语言
C语言中的预处理器指令,涵盖其基本概念、常见指令(如`#define`、`#include`、条件编译指令等)、使用技巧及注意事项
本文深入解析C语言中的预处理器指令,涵盖其基本概念、常见指令(如`#define`、`#include`、条件编译指令等)、使用技巧及注意事项,并通过实际案例分析,展示预处理器指令在代码编写与处理中的重要性和灵活性。
97 2
|
4月前
|
C语言
【总结】单片机重点知识总结记录之C语言条件编译(五)
【总结】单片机重点知识总结记录之C语言条件编译(五)
|
9月前
|
编译器 C语言
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
|
8月前
|
Unix 编译器 C语言
C语言中的条件编译:探索编译时的决策
C语言中的条件编译:探索编译时的决策
|
8月前
|
程序员 C语言
C语言中的宏定义:从常量到高级技巧
C语言中的宏定义:从常量到高级技巧
342 1
|
9月前
|
编译器 C语言
【C语言】什么是宏定义?(#define详解)
【C语言】什么是宏定义?(#define详解)
171 0

热门文章

最新文章