C-宏定义, 预处理, 条件编译

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C-宏定义, 预处理, 条件编译相关的知识,希望对你有一定的参考价值。

define宏定义:
1. 是一个预处理指令, 在编译前执行
2.作用: 可以为一段C代码定义1个标识, 如果需要在后面使用这段C代码, 那么直接使用这个标识就行了
3. 原理: 在预编译的时候, 就会执行源文件中的预处理指令, 会将C代码中使用宏名的地方替换为宏值
——上述过程就称之为宏替换
4. 无论宏值是什么东西, 在定义宏的时候, 不会去检查语法, 只有当完成了宏替换的时候, 才会去检查替换以后, 是否符合语法规范
5. 如果宏值是一个表达式, 那么宏值并不是这个表达式的结果, 而是表达式这个语句
6. 如果宏值中包含了变量名, 在使用宏之前, 需要保证该变量已经存在 
7. 无法通过赋值运算来修改宏值, 因为宏根本不是变量
8. 宏可以定义在函数的内部, 也可以定义在函数的外部, 但是不能在其定义之前访问, 在宏定义之后的所有地方, 都能够直接对其访问使用
 
undef 解除宏定义
1. 出现以后, 后面的所有地方都不能够再使用之前的宏定义定义的宏值
 
注意:
1. 字符串中出现的宏名不会被识别成宏, 而是会被认为是字符串的一部分, 字符串中并不会出现宏替换
2. 层叠宏替换
#define PI 3.14
#define R 5
#define AREA PI*R*R
3. 虽然可以在宏值里加 ‘;’,  但是一般情况下不建议加
 
 
#define 和 #typedef 的区别
1. #define是一个预处理指令, 在预编译的时候执行. 在预编译的时候会把宏名换成宏值
2. #typedef是取别名
 
 
带参数的宏
1. 在定义宏的时候, 宏名是可以带参数的
  在宏值当中, 可以直接使用这个宏
#define N(a) a+a+a
 
2. 如果使用的宏有参数, 那么久必须要在使用它的时候为这个宏的参数传值
 
3. 原理:
1. 先将传入的值传递给宏的参数, 那么宏的参数的值就是我们传递的值
2. 再把宏值当中使用参数的地方换成参数的值
3. 最后, 再将使用宏名的地方, 替换为最后的宏值
 
4. 注意
1. 宏不是函数, 所以宏的参数不需要加类型说明符, 直接写参数名就可以了
 
传递:
本色传递
 
大段代码尽量别用宏, 用函数
 
 
条件编译指令
1. 是一个预处理命令, 预编译阶段执行
2. 作用
默认情况下, 所有C代码都会被编译为二进制代码
条件编译指令作用下, 可以让编译器只编译指定部分的代码
3. 用法
1. #if 条件
c代码
    #endif
    在预编译的时候, 如果条件成立, 就会就将其中的C代码编译成二进制指令, 如果不成立,  不编译
注意:  条件语句必须也是预编译的语句
2. #if 条件
c代码
    #elif 条件
c代码
    #else 条件
c代码
    #endif
`
3. #ifdef 宏名
C代码
  #endif
  如果定义了宏, 那就执行C代码
4. #ifndef 宏名
C代码
    #endif
    如果没用定义指定的宏, 那就执行C代码
 
4. 跟if语句的对比
1. 条件编译是一个预处理指令, 在预处理阶段进行
    if语句是一段C代码, 在程序运行时执行
2. if 语句无论如何全部都要被编译为二进制指令
    条件编译指令,  只会编译符合条件的C代码
3. 实际上, if语句一定程度上可以转换成条件编译指令
    但是, 条件编译指令的条件不能使变量参与, 只能是宏
 
 
static 和 extern
 
static:
1. 修饰变量的, 静态, 声明在常量区
2. 在程序以启动的时候, 就已经声明在常量区了
3. 当我们执行函数的时候, 不会再去执行声明静态变量的那句话, 直接略过, 并且在函数执行完毕以后,  静态变量不会被回收, 直到程序结束以后才会被回收
4. 无论函数执行多少次, 静态变量都只有1个
1 void test(){
2     static int num = 10;
3     num++;
4     print(“num = %d\n”, num);
5 }

 

主函数中调用
1 test();
2 test();
3 test();
输出的值: 11 12 13
5. 与全局变量的区别
全局变量可以在所有的函数里面访问, 而静态变量只能在定义静态变量的函数中访问
6.什么时候需要静态变量
1. 特点和作用
1. 无论函数执行多少次, 这个静态变量都只有1份, N次函数共享
 
总结:
数据类型
1. 基本数据类型
int  double  float   char
2. 构造类型 
数组, 结构体, 枚举
3. 指针
4. void空类型
5. typedef 定义类型
 

以上是关于C-宏定义, 预处理, 条件编译的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的“宏”是指啥?

如何在Makefile中定义宏进行条件编译

C语言_宏

C语言宏定义

C语言---面试之预处理篇

C中预编译详解